python - 自动提取压缩的 .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}'
)
上面的代码似乎无法提取上述格式。有什么建议么?
解决方案
您的文件是bz2
,因此您应该使用bz2 python 库。
要解压缩您的对象:
decompressed_bytes = bz2.decompress(zip_obj.get()["Body"].read())
推荐阅读
- r - 如何在ggplot中标记每组的最小值和最大值?
- java - 在 pom.xml 文件中注释“spring-boot-starter-security”后无法启动 tomcat 服务器
- mysql - mysql中通过外键连接的表之间如何映射数据?
- kubernetes - 如何删除ceph osd块?
- reactjs - Reactjs是否有多元素类型声明的快捷方式
- php - 无法让 Xdebug 使用浏览器扩展在 VSCode 上工作
- sql - 使用 Rails 简化查询
- java - 将 AWS lambda 函数打包到不同的 jar 中
- python - 从 python 请求中发送图像
- javascript - 为什么函数打印 i: 6 而不是 i: 5