在Python中将文件对象添加到Zip文件中

10 投票
2 回答
3641 浏览
提问于 2025-04-17 05:58

Python的ZipFile接口似乎只允许将文件路径传递给ZipFile.write,或者将字节串传递给ZipFile.writestr,而没有其他的选择。我希望能够传递一个类似文件的对象,比如django.core.files.storage.DefaultStorage,其实任何类似文件的对象都可以。目前我觉得我只能选择把文件保存到磁盘上,或者把它读入内存。这两种方法都不是特别理想。

2 个回答

3

虽然没有直接处理文件对象的选项,但可以使用一个选项来打开一个zip文件中的条目进行写入(ZipFile.open)。 [文档]

import zipfile
import shutil
with zipfile.ZipFile('test.zip','w') as archive:
    with archive.open('test_entry.txt','w') as outfile:
        with open('test_file.txt','rb') as infile:
            shutil.copyfileobj(infile, outfile)

你可以直接使用输入流作为数据源,这样就不需要先把文件复制到磁盘上。不过,这样的缺点是如果你的输入流出现问题,生成的zip文件就会无法使用。在我的应用中,我们会跳过有错误的文件,因此我们最终还是会得到一个文件的本地副本,以确保数据的完整性,并保持zip文件可用。

10

你说得对,这确实只有这两个选择。如果你的 DefaultStorage 对象很大,可能先把它保存到硬盘上比较好;否则,我建议你使用:

zipped = ZipFile(...)
zipped.writestr('archive_name', default_storage_object.read())

如果 default_storage_object 是一个 StringIO 对象,你可以用 default_storage_object.getvalue() 来获取它的内容。

撰写回答