在 python 中将 StringIO 写回磁盘

writing StringIO back to disk in python

我使用 StringIOzipfile:

创建了一个内存中的 zip 文件
inMemoryZip = StringIO()
outfile = zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED)
//outfile.write(stuff)
inMemoryZip.seek(0)
return inMemoryZip

此数据已上传到 server/database。在某些时候,它已被检索,我需要将其作为 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()return是什么意思? StringIO 实例中所有文件的数据?

如何确定我之前压缩的文件的名称,以便可以使用相同的名称重新创建它们?

有这个:How can I pass a Python StringIO() object to a ZipFile(), or is it not supported? 但如果一次只写入 1 个文件,它看起来可以工作。我的 StringIO 实例可以有 1 个文件或 10 个文件。

您需要按照@Kupiakos 的建议打开最终文件 "wb",否则您将得到损坏的存档。您的另一个问题是您需要在使用 StringIO 缓冲区之前关闭压缩文件。关闭将文件目录写入 zip 文件。否则,解压缩程序可能会做出假设,例如这只是一个多部分压缩包中的一个,并做一些奇怪的事情。名义上,只需添加 outfile.close() 或将其放入上下文管理器

inMemoryZip = StringIO()
with zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED) as output:
    //outfile.write(stuff)
inMemoryZip.seek(0)
return inMemoryZip

然后

with open('pathToNewZip.zip', 'wb') as archive:
  archive.write(inMemoryZip.getvalue())