gpt4 book ai didi

python - 从 Python 中的生成器创建一个 zip 文件?

转载 作者:IT老高 更新时间:2023-10-28 20:52:55 25 4
gpt4 key购买 nike

我有大量数据(几场演出)需要用 Python 写入一个 zip 文件。我不能一次将其全部加载到内存中以传递给 ZipFile 的 .writestr 方法,我真的不想使用临时文件将其全部输入磁盘然后再读回。

有没有办法将生成器或类似文件的对象提供给 ZipFile 库?还是因为某些原因似乎不支持此功能?

通过 zip 文件,我的意思是 zip 文件。在 Python zipfile 包中受支持。

最佳答案

唯一的解决方案是重写它用于压缩文件以从缓冲区读取的方法。将它添加到标准库中将是微不足道的;我有点惊讶它还没有完成。我收集到很多人都同意整个界面需要大修,这似乎阻碍了任何增量改进。

import zipfile, zlib, binascii, struct
class BufferedZipFile(zipfile.ZipFile):
def writebuffered(self, zipinfo, buffer):
zinfo = zipinfo

zinfo.file_size = file_size = 0
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell()

self._writecheck(zinfo)
self._didModify = True

zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
self.fp.write(zinfo.FileHeader())
if zinfo.compress_type == zipfile.ZIP_DEFLATED:
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15)
else:
cmpr = None

while True:
buf = buffer.read(1024 * 8)
if not buf:
break

file_size = file_size + len(buf)
CRC = binascii.crc32(buf, CRC) & 0xffffffff
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)

self.fp.write(buf)

if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
self.fp.write(buf)
zinfo.compress_size = compress_size
else:
zinfo.compress_size = file_size

zinfo.CRC = CRC
zinfo.file_size = file_size

position = self.fp.tell()
self.fp.seek(zinfo.header_offset + 14, 0)
self.fp.write(struct.pack("<LLL", zinfo.CRC, zinfo.compress_size, zinfo.file_size))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo

关于python - 从 Python 中的生成器创建一个 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/297345/

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