две части кода Python создает zip-архив, одна из двух сломана - PullRequest
0 голосов
/ 04 октября 2019

Изначально я хочу динамически создать zip-файл и вернуть его в ответе http. Я использую Python 3.7 lib Zipfile. Я пробовал оба буфера io и tmp dir, ни один из них не создает действительный zip-архив. Архив открывается только в том случае, если он сохранен на диске. Импорт zipfile Импорт io

#==============================================
# V1

file_like_object = io.BytesIO()

myZipFile = zipfile.ZipFile(file_like_object, "w", compression=zipfile.ZIP_DEFLATED)
myZipFile.writestr(u'test.py', b'test')

tmparchive="zip1.zip"

out = open(tmparchive,'wb') ## Open temporary file as bytes
out.write(file_like_object.getvalue())
out.close()

r = open(tmparchive, 'rb')
print (r.read())
r.close()

#==============================================



# V2

tmparchive2 = 'zip2.zip'

myZipFile2 = zipfile.ZipFile(tmparchive2, "w", compression=zipfile.ZIP_DEFLATED)
myZipFile2.writestr(u'test.py', b'test')

r2 = open(tmparchive2, 'rb')
print (r2.read())
r2.close()

#====================================================

1 Ответ

0 голосов
/ 04 октября 2019

Предпочтительно использовать менеджер контекста , например, так:

import zipfile, io

file_like_object = io.BytesIO()
with zipfile.ZipFile(file_like_object, "w", compression=zipfile.ZIP_DEFLATED) as myZipFile:
    myZipFile.writestr(u'test.txt', b'test')

# file_like_object.getvalue() are the bytes you send in your http response.

Я записал его в файл. Это определенно действительный zip-файл.

Если вы хотите открыть архив, вам нужно сохранить его на диск. Такие приложения, как Explorer и 7-Zip, не имеют возможности прочитать объект BytesIO, существующий в процессе python. Они могут открывать только архивы, сохраненные на диске.

Вызов print(r.read()) не собирается открывать архив. Он просто напечатает байты, которые составляют крошечный zip-файл, который вы только что создали.

...