我有大量数据(几个G)需要在Python中写入zip文件。我无法一次性将所有数据加载到内存中,然后传递给ZipFile的.writestr方法,并且我真的不想使用临时文件将它全部写入磁盘,然后再重新读取。
有没有一种方法可以将生成器或类似文件的对象提供给ZipFile库?或者有没有某种原因不支持这种功能?
“zip文件”指的是zip文件,在Python的zipfile包中得到支持。
我有大量数据(几个G)需要在Python中写入zip文件。我无法一次性将所有数据加载到内存中,然后传递给ZipFile的.writestr方法,并且我真的不想使用临时文件将它全部写入磁盘,然后再重新读取。
有没有一种方法可以将生成器或类似文件的对象提供给ZipFile库?或者有没有某种原因不支持这种功能?
“zip文件”指的是zip文件,在Python的zipfile包中得到支持。
gzip库将接受一个文件对象进行压缩。
class GzipFile([filename [,mode [,compresslevel [,fileobj]]]])
您仍需要提供一个名义文件名以包含在zip文件中,但可以将数据源传递给fileobj。
(这个答案与Damnsweet的答案不同,因为重点应该放在增量读取数据源上,而不是增量写入压缩文件。)
现在我看到原问题提问者不接受Gzip :-(
http://docs.python.org/2/library/zipfile#zipfile.ZipFile.writestr
zipstream-ng库可以处理这种情况:
from zipstream import ZipStream
def my_iterator():
yield b"some bytes"
def my_other_iterator():
yield b"some bytes"
zs = ZipStream()
zs.add(my_iterator(), "file.ext")
zs.add(my_other_iterator(), "otherfile.ext")
with open("out.zip", "wb") as fp:
fp.writelines(zs)