【发布时间】:2016-12-15 09:46:25
【问题描述】:
我正在尝试从我在 AWS 中运行的 Hadoop 进程中读取一些日志。日志存储在 S3 文件夹中,路径如下。
桶名 = 名称 键 = y/z/stderr.gz 这里 Y 是集群 ID,z 是文件夹名称。这两者都充当 AWS 中的文件夹(对象)。所以完整路径就像 x/y/z/stderr.gz。
现在我想解压这个 .gz 文件并读取文件的内容。我不想将此文件下载到我的系统想要将内容保存在 python 变量中。
这是我到目前为止所尝试的。
bucket_name = "name"
key = "y/z/stderr.gz"
obj = s3.Object(bucket_name,key)
n = obj.get()['Body'].read()
这给了我一种不可读的格式。我也试过了
n = obj.get()['Body'].read().decode('utf-8')
给出错误utf8'编解码器无法解码位置1的字节0x8b:无效的起始字节。
我也试过了
gzip = StringIO(obj)
gzipfile = gzip.GzipFile(fileobj=gzip)
content = gzipfile.read()
这会返回一个错误IOError: Not a gzipped file
不确定如何解码这个 .gz 文件。
编辑 - 找到解决方案。需要传入 n 并使用 BytesIO
gzip = BytesIO(n)
【问题讨论】:
-
gzip = StringIO(obj)如果您使用的是 python 3,则需要gzip = BytesIO(obj)。这是二进制数据。 -
当然你也想要
BytesIO(obj.get()['Body'].read())。 -
@Jean-FrançoisFabre 它奏效了。谢谢。
-
@KshitijMarwah 请帮助我完成以下查询
标签: python amazon-web-services amazon-s3 boto3