首页 > 解决方案 > 自动提取压缩的 .gz 和 .bz2 s3 文件

问题描述

我从维基百科获得了大约 30 个文件的数据转储,每个文件的未压缩大小约为 2.5 GB。我想自动提取这些文件,但据我了解,我不能使用 Lambda,因为它有文件限制。

我找到了另一个使用 SQS 的替代解决方案,它将调用我正在研究的 EC2 实例。但是,为了使这种情况起作用,我的脚本需要从 S3 存储桶和文件夹中读取所有 zip 文件(.gz 和 .bz2)并提取它们。

但是在使用 python 的 zipfile 模块时,我收到以下错误:

zipfile.BadZipFile: File is not a zip file

有针对这个的解决方法吗?

这是我的代码:

import boto3
from io import BytesIO
import zipfile

s3_resource = boto3.resource('s3')
zip_obj = s3_resource.Object(bucket_name="backupwikiscrape", key= 'raw/enwiki-20200920-pages-articles-multistream1.xml-p1p41242.bz2')
buffer = BytesIO(zip_obj.get()["Body"].read())

z = zipfile.ZipFile(buffer)
for filename in z.namelist():
    file_info = z.getinfo(filename)
    s3_resource.meta.client.upload_fileobj(
        z.open(filename),
        Bucket='backupwikiextract',
        Key=f'{filename}'
    )

上面的代码似乎无法提取上述格式。有什么建议么?

标签: pythonamazon-web-servicesamazon-s3gzipboto3

解决方案


您的文件是bz2,因此您应该使用bz2 python 库。

要解压缩您的对象:

decompressed_bytes = bz2.decompress(zip_obj.get()["Body"].read())

推荐阅读