Я хотел бы сохранить несколько объектов, например. рисунки, созданные в цикле, сразу в zip-файл, без сохранения их в каталоге.
На данный момент я сохраняю рисунки в папку, а затем архивирую их.
import matplotlib.pyplot as plt
from zipfile import ZipFile
for i in range(10):
plt.plot([i, i])
plt.savefig('fig_' + str(i) + '.png')
plt.close()
image_list = []
for file in os.listdir(save_path):
if file.endswith(".png"):
image_list.append(os.path.join(save_path, file))
with ZipFile(os.path.join(save_path, 'export.zip'), 'w') as zip:
for file in image_list:
zip.write(file)
В случае положительного ответа, есть ли способ сделать то же самое для любого типа объекта или это зависит от типа объекта?
Большое спасибо
Привет, непонятно, как сохранить каждую фигуру с относительным именем в конечном zip-файле, даже если я создаю пустой zip-файл, а затем добавляю zipfile.ZipFile('zipfile_append.zip', mode='a')
@BoarGules указал на [Python.Docs]: ZipFile.writestr(zinfo_or_arcname, данные, Compress_type=Нет, CompressLevel=Нет), который позволяет создавать элемент zip-файла с содержимым из памяти
[SO]: как сохранить фигуру pylab в файл в памяти, который можно прочитать в образе PIL? Ответ (@unutbu) показывает, как сохранить содержимое изображения графика в памяти ([Matplotlib]: matplotlib.pyplot.savefig), через [Python.Docs]: класс io.BytesIO([initial_bytes])
Все, что вам нужно сделать, это объединить вышеперечисленные 2
code00.py:
#!/usr/bin/env python
import sys
import matplotlib.pyplot as plt
import zipfile
import io
def main(*argv):
zip_file_name = "export.zip"
print("Creating archive: {:s}".format(zip_file_name))
with zipfile.ZipFile(zip_file_name, mode = "w") as zf:
for i in range(3):
plt.plot([i, i])
buf = io.BytesIO()
plt.savefig(buf)
plt.close()
img_name = "fig_{:02d}.png".format(i)
print(" Writing image {:s} in the archive".format(img_name))
zf.writestr(img_name, buf.getvalue())
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(sys.argv[1:])
print("\nDone.")
sys.exit(rc)
Выход:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055616877]> dir /b code00.py [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055616877]> "e:\Work\Dev\VEnvs\py_pc064_03.08.07_test0\Scripts\python.exe" code00.py Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] 64bit on win32 Creating archive: export.zip Writing image fig_00.png in the archive Writing image fig_01.png in the archive Writing image fig_02.png in the archive Done. [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055616877]> dir /b code00.py export.zip
Как вы заметили, файлы (изображения) вообще не сжимаются (размер архива немного больше, чем сумма размеров элементов). Чтобы включить сжатие, также передайте compression=zipfile.ZIP_DEFLATED
инициализатору Zip-файл.
@AlessandroBitetto: это ответ на твой вопрос?
Посмотрите на
ZipFile.writestr()
. Несмотря на имя функции, параметрdata
может бытьbytes
или строкой, и если это строка, то перед сохранением она будет закодирована как UTF-8.