直接从内存保存多个对象到zip文件

7
我希望能够直接将在循环中创建的多个对象(例如图形)保存到zip文件中,而无需将它们保存在目录中。
目前,我将这些图形保存在一个文件夹中,然后再将它们压缩为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
嗨,不清楚如何在最终的zip文件中保存每个图形并使用相对名称,即使我创建了一个空的zip文件,然后使用zipfile.ZipFile('zipfile_append.zip', mode='a')进行附加。 - Alessandro Bitetto
1个回答

6
  1. @BoarGules指出[Python.Docs]: ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)允许从内存中创建一个带有内容的zip文件成员
  2. [SO]: how to save a pylab figure into in-memory file which can be read into PIL image? (@unutbu 的回答)演示了如何将绘图图像内容保存在内存中([Matplotlib]: matplotlib.pyplot.savefig),通过 [Python.Docs]: class io.BytesIO([initial_bytes])
  3. 你所要做的就是将它们组合起来

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

你会注意到,这些(图像)文件完全没有被压缩(存档大小略大于成员大小之和)。要启用压缩,请在ZipFile的初始化器中还传递compression=zipfile.ZIP_DEFLATED


@AlessandroBitetto:这个回答解决了你的问题吗? - CristiFati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接