用Python从生成器创建zip文件?

25

我有大量数据(几个G)需要在Python中写入zip文件。我无法一次性将所有数据加载到内存中,然后传递给ZipFile的.writestr方法,并且我真的不想使用临时文件将它全部写入磁盘,然后再重新读取。

有没有一种方法可以将生成器或类似文件的对象提供给ZipFile库?或者有没有某种原因不支持这种功能?

“zip文件”指的是zip文件,在Python的zipfile包中得到支持。


1
我在标题和第一句话中都说了这句话。我已经添加了澄清,尽管我不明白为什么需要这样做。如果我只需要任何通用的压缩算法,我一开始就会这么说的。 - Chris B.
似乎在大多数情况下,ZIP指的是GZIP。因此,当你说ZIP(例如PKWare ZIP)时,必须澄清区别。是的,人们为什么会把PKWare Zip和GZip混淆是令人困惑的。 - S.Lott
我猜,最为人所知的压缩应用程序WinZip、PKWARE Zip和7zip的“gzip支持”可能会让人们认为gzip的实现是不费力的。 - altunyurt
13个回答

0

gzip库将接受一个文件对象进行压缩。

class GzipFile([filename [,mode [,compresslevel [,fileobj]]]])

您仍需要提供一个名义文件名以包含在zip文件中,但可以将数据源传递给fileobj。

(这个答案与Damnsweet的答案不同,因为重点应该放在增量读取数据源上,而不是增量写入压缩文件。)

现在我看到原问题提问者不接受Gzip :-(


0

0

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接