我正在尝试从我在AWS中运行的Hadoop进程中读取一些日志.日志存储在S3文件夹中,并具有以下路径.
bucketname = name key = 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()
Run Code Online (Sandbox Code Playgroud)
这给了我一种不可读的格式.我也试过了
n = obj.get()['Body'].read().decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
这给出了错误utf8'编解码器无法解码位置1中的字节0x8b:无效的起始字节.
我也试过了
gzip = StringIO(obj)
gzipfile = gzip.GzipFile(fileobj=gzip)
content = gzipfile.read()
Run Code Online (Sandbox Code Playgroud)
这将返回错误IOError:不是gzip压缩文件
不确定如何解码此.gz文件.
编辑 - 找到解决方案.需要传递n并使用BytesIO
gzip = BytesIO(n)
Run Code Online (Sandbox Code Playgroud) 我基本上想做的正是文档中的内容gzip.GzipFile:
\n\n\n调用 GzipFile 对象\xe2\x80\x99s close() 方法不会关闭 fileobj,因为您可能希望在压缩数据后附加更多材料。这还允许您传递一个为写入而打开的 io.BytesIO 对象作为 fileobj,并使用 io.BytesIO object\xe2\x80\x99s getvalue() 方法检索结果内存缓冲区。
\n
对于普通文件对象,它可以按预期工作。
\n\n>>> import gzip\n>>> fileobj = open("test", "wb")\n>>> fileobj.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=fileobj)\n>>> gzipfile.writable()\nTrue\nRun Code Online (Sandbox Code Playgroud)\n\ngzip.GzipFile但在传递对象时我无法设法获取可写对象io.BytesIO。
>>> import io\n>>> bytesbuffer = io.BytesIO()\n>>> bytesbuffer.writable()\nTrue\n>>> gzipfile = gzip.GzipFile(fileobj=bytesbuffer)\n>>> gzipfile.writable()\nFalse\nRun Code Online (Sandbox Code Playgroud)\n\n我是否必须打开io.BytesIO显式内容才能进行写入?我该怎么做?或者返回的文件对象和 我没有想到的open(filename, "wb")返回的对象之间是否有区别?io.BytesIO()