Я создал ZIP-файл в памяти, используя StringIO
и zipfile
:
inMemoryZip = StringIO()
outfile = zipfile.ZipFile(inMemoryZip, 'w', compression=zipfile.ZIP_DEFLATED)
//outfile.write(stuff)
inMemoryZip.seek(0)
return inMemoryZip
Эти данные загружаются на сервер/базу данных. В какой-то момент он получен, и мне нужно записать его на диск в виде zip-файла. Я не знаю, как это сделать. Я пробовал следующее:
with open('pathToNewZip.zip', 'w') as archive:
archive.write(inMemoryZip.getvalue())
Это создает архив zip-файла, но когда я дважды щелкаю по нему, я не вижу его содержимого, он в основном создает копию самого себя (еще один идентичный файл .zip, , но расширение .zip.cpgz ) рядом с оригиналом
Я также пробовал:
with open('pathToNewZip.zip', 'w') as archive:
shutil.copyfileobj(inMemoryZip, archive)
но это тот же результат, что и выше.
Я предполагаю, что часть проблемы заключается в том, что я не знаю, как анализировать эти данные. inMemoryZip
(экземпляр StringIO
) может содержать несколько файлов.
Каждый файл записывается как новая строка?
Что возвращает .getvalue()
? Данные для всех файлов в экземпляре StringIO
?
Как определить имена файлов, которые я заархивировал ранее, чтобы их можно было воссоздать с тем же именем?
Вот это: Как я могу передать объект Python StringIO() в ZipFile(), или он не поддерживается? но похоже, что это работает, если за один раз записывается только 1 файл. мой экземпляр StringIO
может иметь 1 файл или 10 файлов.
open
сwb
, учитывая, что ZIP-файлы являются двоичным форматом. - person Alyssa Haroldsen   schedule 02.03.2016