В примере, представленном Ethier, есть несколько проблем, некоторые из которых основные:
- не работает для реальных данных в Windows. ZIP-файл является двоичным, и его данные всегда должны быть записаны с открытым файлом 'wb'
- ZIP-файл добавляется для каждого файла, это неэффективно. Его можно просто открыть и сохранить как атрибут
InMemoryZip
- В документации указано, что ZIP-файлы должны быть явно закрыты, это не делается в функции добавления (это, вероятно, работает (для примера), поскольку zf выходит за рамки и закрывает ZIP-файл)
- флаг create_system устанавливается для всех файлов в zipfile каждый раз, когда файл добавляется, а не один раз для каждого файла.
- на Python <3 cStringIO намного эффективнее, чем StringIO </li>
- не работает на Python 3 (оригинальная статья была до версии 3.0, но к тому времени, когда код был опубликован, 3.1 уже давно не было).
Обновленная версия доступна, если вы установите ruamel.std.zipfile
(автором которой я являюсь). После
pip install ruamel.std.zipfile
или включая код для класса здесь , вы можете сделать:
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
в этом контексте.