gpt4 book ai didi

python - 如何从 ZipFile 进行流式传输?如何压缩 "on the fly"?

转载 作者:行者123 更新时间:2023-12-01 01:04:26 29 4
gpt4 key购买 nike

我想压缩一个流并输出结果。我正在使用 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() - 流将被关闭,如果我不使用它 - 存档将不完整。

最佳答案

您可以使用stream-zip,而不是使用Python内置的zip文件。 (完全披露:由我撰写)

如果你有一个可迭代的字节,my_data_iter,你可以使用它的 stream_zip 函数获取 zip 文件的可迭代:

from datetime import datetime
from stream_zip import stream_zip, ZIP_64

def files():
modified_at = datetime.now()
perms = 0o600
yield 'my-file-1.txt', modified_at, perms, ZIP_64, my_data_iter

my_zip_iter = stream_zip(files())

如果您需要一个类似文件的对象,比如传递给 boto3 的 upload_fileobj,您可以使用转换函数从可迭代对象进行转换:

def to_file_like_obj(iterable):
chunk = b''
offset = 0
it = iter(iterable)

def up_to_iter(size):
nonlocal chunk, offset

while size:
if offset == len(chunk):
try:
chunk = next(it)
except StopIteration:
break
else:
offset = 0
to_yield = min(size, len(chunk) - offset)
offset = offset + to_yield
size -= to_yield
yield chunk[offset - to_yield:offset]

class FileLikeObj:
def read(self, size=-1):
return b''.join(up_to_iter(float('inf') if size is None or size < 0 else size))

return FileLikeObj()

my_file_like_obj = to_file_like_obj(my_zip_iter)

关于python - 如何从 ZipFile 进行流式传输?如何压缩 "on the fly"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55514745/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com