情况如下:
import boto from boto.s3.connection import S3Connection from boto.s3.key import Key conn = S3Connection('access Id', 'secret access key') b = conn.get_bucket('mydev.myorg') k = Key(b) k.key('documents/document.xml.gz')
import gzip f = open('/tmp/p', 'w') k.get_file(f) f.close() r = gzip.open('/tmp/p', 'rb') file_content = r.read() r.close()
题
如何直接解压缩流并读取内容?
我不想创建临时文件,它们看起来不太好。
是的,您可以使用该zlib模块解压缩字节流:
zlib
import zlib def stream_gzip_decompress(stream): dec = zlib.decompressobj(32 + zlib.MAX_WBITS) # offset 32 to skip the header for chunk in stream: rv = dec.decompress(chunk) if rv: yield rv
到zlib标头的32个偏移量表示gzip标头是预期的但已跳过。
S3键对象是一个迭代器,因此您可以执行以下操作:
for data in stream_gzip_decompress(k): # do something with the decompressed data