如何从ZipFile流式传输?如何“即时”压缩?

时间:2019-04-04 11:23:35

标签: python stream aws-lambda zip

我想压缩数据流并输出结果。我正在使用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()-流将被关闭,如果我不使用流-归档将是不完整的。

1 个答案:

答案 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)