Python - загрузить объект ZipFile в памяти в виде байтов - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть скрипт, который создает закрытый объект ZipFile в памяти, который мне нужно опубликовать как строку байтов (используя запросы);как я это сделал?Я попытался открыть файл, который завершается с помощью «TypeError: ожидаемый объект str, bytes или os.PathLike, а не 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
>>> 

1 Ответ

0 голосов
/ 21 ноября 2018

zfile закрыто.Это бесполезно для тебя.Теперь вам нужно использовать z, файлоподобный объект, который управлял базовым двоичным хранилищем для ZipFile.

Вы можете использовать z.getvalue(), чтобы получить строку байтов, представляющую содержимое z, как вы это сделали с im_out, или вы можете вернуться к началу с z.seek(0) и использовать его с частями requests, которые принимают файловые объекты.

...