Пример Этье предоставленном несколько проблем, некоторые из них главным:
- не работает для реальных данных на Windows. ZIP-файл является двоичным, и его данные всегда должны быть записаны с открытым файлом 'wb'
- ZIP-файл добавляется к каждому файлу, это неэффективно. Его можно просто открыть и сохранить как атрибут
InMemoryZip
- В документации указано, что ZIP-файлы должны быть закрыты явно, это не выполняется в функции добавления (это, вероятно, работает (для примера), потому что zf выходит за рамки и что закрывает ZIP-файл)
- флаг create_system устанавливается для всех файлов в zip-файле каждый время, когда файл добавляется вместо одного раза в файл.
- на Python < 3 cStringIO является гораздо более эффективным, чем StringIO
- не работает на Python 3 (оригинал статьи от до версии 3.0, но к тому времени код был отправлен 3,1 был за долгое время).
Обновленная версия доступна, если вы устанавливаете ruamel.std.zipfile
(из которых я являюсь автором).После
pip install ruamel.std.zipfile
или включая код класса из here, вы можете сделать:
import ruamel.std.zipfile as zipfile
# Run a test
zipfile.InMemoryZipFile()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Вы можете альтернативно записать содержимое с помощью imz.data
в любом месте вам нужно.
Вы также можете использовать with
заявление, и если вы предоставите имя файла, содержимое ZIP будет записано на выходе, что контекст:
with zipfile.InMemoryZipFile('test.zip') as imz:
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
из-за задержки при записи на диск, вы можете на самом деле прочитанный из старого test.zip
в этом контексте.
Хорошо, я вижу, что я был неправ о ZipFile в конце концов. Всем спасибо. –