我想压缩数据流并输出结果。我正在使用AWS Lambda做到这一点,这在可用磁盘空间和其他限制方面很重要。
如果需要的话,我将使用压缩后的流使用upload_fileobj()
或put()
编写一个AWS S3对象。
在我有小对象之前,我可以将存档创建为文件:
import zipfile
zf = zipfile.ZipFile("/tmp/byte.zip", "w")
zf.writestr(filename, my_stream.read())
zf.close()
对于大量数据,我可以创建一个对象而不是文件:
from io import BytesIO
...
byte = BytesIO()
zf = zipfile.ZipFile(byte, "w")
....
但是如何将压缩后的流传递到输出?如果我使用zf.close()
-流将被关闭,如果我不使用流-归档将是不完整的。
答案 0 :(得分:2)
您可能想尝试zipstream版本的zipfile。例如,使用迭代器将stdin压缩为stdout作为zip文件,将数据保存为名为TheLogFile
的文件:
#!/usr/bin/python3
import sys, zipstream
with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as z:
z.write_iter('TheLogFile', sys.stdin.buffer)
for chunk in z:
sys.stdout.buffer.write(chunk)