сохранить несколько объектов в ZIP непосредственно из памяти в Python - PullRequest
2 голосов
/ 10 апреля 2019

Я бы хотел сохранить несколько объектов, например фигур, созданных в цикле, непосредственно в 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)

В случае положительного ответа, есть ли способ сделать то же самое для любого типа объекта или это зависит от типа объекта?

Большое спасибо

1 Ответ

0 голосов
/ 12 апреля 2019
  1. @ BoarGules указал [Python 3]: ZipFile. writestr ( zinfo_or_arcname, data, compress_type = Нет, уровень сжатия = нет ) , что позволяет создать элемент zip-файла с содержимым из памяти

  2. [SO]: как сохранить фигуру Pylab в файл в памяти, которыйможно прочитать в изображение PIL?(ответ @ unutbu) показывает, как сохранить содержимое изображения графика в памяти ( [Matplotlib]: matplotlib.pyplot.savefig ) через [Python 3]: класс io. BytesIO ( [initial_bytes] )

  3. Все, что вам нужно сделать, этокомбинируя вышеприведенные 2

code.py :

#!/usr/bin/env python3

import sys
import matplotlib.pyplot as plt
import zipfile
import io


def main():
    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 {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("Done.")

Выход :

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055616877]> dir /b
code.py

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055616877]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 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
code.py
export.zip

Как вы заметили, файлы (изображений) вообще не сжимаются (размер архива немного больше, чем сумма размеров элементов).Чтобы включить сжатие, также передайте compression=zipfile.ZIP_DEFLATED в ZipFile инициализатор.

...