在Python中将文件对象添加到Zip文件中
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()
来获取它的内容。