繁体   English   中英

Python 中来自 AWS S3 的 gzip 文件的内容仅返回 null 字节

[英]Contents of a gzip file from a AWS S3 in Python only returning null bytes

AWS Comprehend 在 S3 存储桶中创建了一个名为output.tar.gz的文件。

我正在尝试使用 Python 将此文件加载到 memory 中,并尝试了以下操作:

import boto3
from io import BytesIO
import gzip

s3 = boto3.client("s3")
obj = s3.get_object(Bucket=BUCKET, Key=KEY)
mycontentzip = gzip.GzipFile(fileobj=BytesIO(obj['Body'].read())).read()
lines = mycontentzip.decode("utf-8")

我还尝试了这篇文章中的解决方案,包括不再需要 BytesIO: Reading contents of a gzip file from a AWS S3 in Python

我可以使用这些解决方案返回一个不是.gz的测试文件,以确保我可以正确连接到 S3 存储桶。

在所有尝试中,返回的是一个文件,它只有以下内容:

00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x...

我正在使用 Python=3.7.7 Boto3=1.10.5

我还尝试从 AWS 控制台手动下载文件。 奇怪的是,该文件在 MacOS 10.15.6 中解压缩为“.jsonl”文件。 但是,在 VScode 中打开它可以很好地查看为 JSON。

有没有其他人遇到过这个问题?

提前感谢您的任何想法。

#----------------------------------------------------------

更新

谢谢@AKX。 tarfile 就是这样。 在文档中发现 Tarfile 模块中有一个 Gzip 读取模式: https://docs.python.org/3/library/tarfile.ZFC35FDC70D5FC69D269883A822C7A53E

s3 = boto3.resource("s3")
obj = s3.Object(BUCKET, KEY)    
tar = tarfile.open(fileobj=BytesIO(obj.get()["Body"].read()), mode='r|gz')
tar.extractall('tmp_folder')

尝试将存档中的单个文件读入 memory,但将其保存到磁盘并再次读取更容易。 我正在处理少量数据。

那是一个 tar.gz 文件,即使用gzip算法压缩的tar存档。

如果您只是使用gzip.GzipFile()阅读它,您仍然有一个需要解释的二进制 tar 存档。

使用tarfile模块读取它; tar 档案,如 zip,可以包含多个文件,其中之一是您最终看到的.jsonl文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM