【发布时间】:2016-06-15 21:43:15
【问题描述】:
我使用StringIO 和zipfile 创建了一个内存压缩文件:
inMemoryZip = StringIO()
outfile = zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED)
//outfile.write(stuff)
inMemoryZip.seek(0)
return inMemoryZip
此数据被上传到服务器/数据库。在某些时候,它被检索了,我需要将它作为 zip 文件写入磁盘。我不知道该怎么做。我尝试了以下方法:
with open('pathToNewZip.zip', 'w') as archive:
archive.write(inMemoryZip.getvalue())
这会创建 zip 文件存档,但是当我双击它时,我看不到它的内容,它基本上会创建一个自己的副本(另一个相同的 .zip 文件,但扩展名为 . zip.cpgz) 在原版旁边
我也试过了:
with open('pathToNewZip.zip', 'w') as archive:
shutil.copyfileobj(inMemoryZip, archive)
但结果和上面一样。
我猜部分问题是我不知道如何解析这些数据。 inMemoryZip(它是StringIO 的一个实例)中可能有多个文件。
每个文件都写成一个新行吗?
.getvalue() 返回什么? StringIO 实例中所有文件的数据?
如何确定我之前压缩的文件的名称,以便可以使用相同的名称重新创建它们?
有这个:How can I pass a Python StringIO() object to a ZipFile(), or is it not supported? 但如果一次只写入 1 个文件,它看起来就可以工作。我的StringIO 实例可以有 1 个文件或 10 个文件。
【问题讨论】:
-
请注意,考虑到 ZIP 文件是二进制格式,您可能应该使用
open和wb。 -
这是 python 2 还是 3?
标签: python zipfile shutil stringio