在python中将StringIO写回磁盘

wj8zmpe1  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(106)

我使用StringIOzipfile创建了一个内存中的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)

但其结果与上述相同。
我猜部分问题是我不知道如何解析这些数据,inMemoryZipStringIO的一个示例)可能包含多个文件。
每个文件都写为一个新行吗?
.getvalue()返回什么?StringIO示例中所有文件的数据?
如何确定以前压缩的文件的名称,以便可以使用相同的名称重新创建它们?
有这样的:How can I pass a Python StringIO() object to a ZipFile(), or is it not supported?,但是如果一次只写入1个文件,它看起来会起作用。我的StringIO示例可以有1个文件或10个文件。

jrcvhitl

jrcvhitl1#

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

def foo():
    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())

相关问题