在 python 中将 StringIO 写回磁盘
writing StringIO back to disk in python
我使用 StringIO
和 zipfile
:
创建了一个内存中的 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())
我使用 StringIO
和 zipfile
:
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())