Python - 将内存中的 ZipFile 对象加载为字节
Posted
技术标签:
【中文标题】Python - 将内存中的 ZipFile 对象加载为字节【英文标题】:Python - load an in-memory ZipFile object as bytes 【发布时间】:2018-11-20 16:47:26 【问题描述】:我有一个脚本,它创建一个封闭的内存 ZipFile 对象,我需要将其作为字节字符串发布(使用请求);我怎么做?我尝试打开文件,但失败并显示“TypeError: expected str, bytes or os.PathLike object, not ZipFile”
如果我将 ZipFile 写入一个文件,然后打开该文件以获取发布数据,该脚本就可以正常工作。但是它可能会迭代超过几百万个文件,这似乎是很多临时文件和磁盘活动。
import io
import zipfile
from PIL import Image
z = io.BytesIO()
zfile = zipfile.ZipFile(z,"a")
zipdict =
img_loc = "D:/Images/seasons-3.jpg"
im_original = Image.open(img_loc)
imfmt = im_original.format
im = im_original.copy()
im_original.close()
im_out = io.BytesIO()
im.save(im_out,imfmt)
zfile.writestr("seasons-3.jpg",im_out.getvalue())
im_out.close()
zipdict['seasons-3']=zfile
zfile.close()
运行出错:
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
>>> zipdict['seasons-3']
<zipfile.ZipFile [closed]>
>>> pl_data = open(zipdict['seasons-3'])
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
pl_data = open(zipdict['seasons-3'])
TypeError: expected str, bytes or os.PathLike object, not ZipFile
>>>
【问题讨论】:
你能粘贴你的代码和错误回溯吗? "关闭的内存 ZipFile" - 你将不得不解释更多。您是否将 ZipFile 包裹在 BytesIO 或其他东西上? 我不确定它是否有助于内存中的 zip 文件(在野外从未遇到过),但您可以从存档中解压缩单个文件:***.com/a/46423414/962190 @user2357112 这几乎就是我所做的。我创建了一个 ZipFile 并使用 writestr 将几个 BytesIO 添加到 ZipFile。然后我将 ZipFile 作为值添加到 dict,键作为文件名,然后关闭 ZipFile。 @Timachee:不,这仍然不能解释事情。如果有的话,您做了什么来将 ZipFile 本身放入内存中?您将哪些参数传递给 ZipFile 构造函数? 【参考方案1】:zfile
已关闭。对你没用。您现在需要使用的是z
,它是一个类似文件的对象,用于管理 ZipFile 的底层二进制存储。
您可以使用z.getvalue()
来获取表示z
内容的字节串,就像您使用im_out
所做的那样,或者您可以使用z.seek(0)
回到开头并将其与@ 的部分一起使用987654327@ 接受类似文件的对象。
【讨论】:
谢谢 user2357112,但我需要将数据作为压缩文件的字节串发布,所以我不确定这个解决方案是否可行。 @Timachee:是什么让你认为这行不通?听起来您误解了 ZipFile 对象的作用。 再次感谢您,并对延迟回复表示歉意。昨天早上我又猜到了自己,得出了几乎相同的结论。所以我尝试上传 z.getvalue() 作为我的数据。当文件上传到服务器时,我试图摄取的系统以“解压缩文件时发生错误(存档不是 ZIP 存档)”拒绝它 @Timachee:可能是您与 Web API 交互的方式存在问题,或者您可能不小心在z
中添加了除 zip 内容之外的其他内容。从这里很难说。
是的,当我运行脚本将 zip 保存到磁盘并使用 open(path_to_saved_zip) 而不是 z.getvalue() 时,一切正常。如果我理解正确的话,z.getvalue() 应该等同于 open(saved_zip),对吧?以上是关于Python - 将内存中的 ZipFile 对象加载为字节的主要内容,如果未能解决你的问题,请参考以下文章
Python 3:使用内存 Xml 创建内存 Zipfile