Сохранить несколько объектов в zip прямо из памяти в Python

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

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

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

Посмотрите на ZipFile.writestr(). Несмотря на имя функции, параметр data может быть bytes или строкой, и если это строка, то перед сохранением она будет закодирована как UTF-8.

BoarGules 10.04.2019 18:14

Привет, непонятно, как сохранить каждую фигуру с относительным именем в конечном zip-файле, даже если я создаю пустой zip-файл, а затем добавляю zipfile.ZipFile('zipfile_append.zip', mode='a')

Alessandro Bitetto 11.04.2019 10:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
2
2 098
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. @BoarGules указал на [Python.Docs]: ZipFile.writestr(zinfo_or_arcname, данные, Compress_type=Нет, CompressLevel=Нет), который позволяет создавать элемент zip-файла с содержимым из памяти

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

  3. Все, что вам нужно сделать, это объединить вышеперечисленные 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: это ответ на твой вопрос?

CristiFati 17.04.2019 22:21

Другие вопросы по теме