【问题标题】:writing StringIO back to disk in python在python中将StringIO写回磁盘
【发布时间】:2016-06-15 21:43:15
【问题描述】:

我使用StringIOzipfile 创建了一个内存压缩文件:

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 文件是二进制格式,您可能应该使用 openwb
  • 这是 python 2 还是 3?

标签: python zipfile shutil stringio


【解决方案1】:

您需要按照@Kupiakos 的建议打开最终文件“wb”,否则您将得到一个损坏的存档。您的另一个问题是您需要在使用StringIO 缓冲区之前关闭压缩文件。关闭将文件目录写入 zipfile。没有它,解压缩器可能会做出这样的假设,例如这只是多部分 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())

【讨论】:

  • 你就是那个男人!我没有关闭 zip 文件,这就是它不起作用的原因。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2012-07-20
相关资源
最近更新 更多