我使用StringIO
和zipfile
创建了一个内存中的zip文件:
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个文件。
1条答案
按热度按时间jrcvhitl1#
你需要按照@Kupiakos的建议打开最后一个文件“wb”,否则你会得到一个损坏的压缩包。你的另一个问题是,你需要在使用
StringIO
缓冲区之前关闭zipfile。关闭会将文件目录写入zipfile。如果没有这个,解压缩可能会做出假设,比如这只是一个多部分压缩文件中的一个,并做一些奇怪的事情。名义上,只需添加outfile.close()
或将其放入上下文管理器(with
子句)然后稍后