Python - загрузить объект ZipFile в памяти в виде байтов

У меня есть скрипт, который создает закрытый объект 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 ответ

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

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

Другие вопросы по тегам