Errno 20:保存到 zip 文件时不是目录

Errno 20: Not a directory when saving into zip file

当我尝试将 pyplot 图另存为 jpg 时,我不断收到目录错误,指出给定的文件名不是目录。我在 Colab 工作。我有一个名为 z_img 的 numpy 数组并打开了一个 zip 文件。

import matplotlib.pyplot as plt
from zipfile import ZipFile

zipObj = ZipFile('slices.zip', 'w') # opening zip file
plt.imshow(z_img, cmap='binary')

绘图工作正常。我做了一个将图像保存到 Colab 的常规内存中的测试,如下所示:

plt.savefig(str(ii)+'um_slice.jpg')

这非常有效,除了我打算在 for 循环中使用这段代码。 ii 是区分每个图像的索引,将创建数百个图像,因此我希望它们进入 zipfile。现在,当我尝试将路径添加到压缩文件时:

plt.savefig('/content/slices.zip/'+str(ii)+'um_slice.jpg')

我得到:NotADirectoryError:[Errno 20] 不是目录:'/content/slices.zip/150500um_slice.jpg'

我认为这是因为 {}.jpg 字符串是文件名,而不是目录本身。但我对 Python 很陌生,不知道如何将情节放入 zip 文件中。这就是我想要的。希望得到任何建议!

首先,对于任何非摄影内容(即漂亮和柔和),JPEG 都是错误的格式。使用不同的文件格式会更好。 PNG 适合像素,SVG 适合矢量图形(以防您稍后将其嵌入网站!),PDF 也适合矢量。

错误消息非常准确:您不能像保存目录一样保存到 zip 文件。

多种解决方法:

  • 使用 tempfile 模块的 mkdtemp 创建一个临时目录,保存到其中,然后压缩结果
  • 不是保存到文件名中,而是保存到缓冲区中(我猜是 BytesIO)并将其附加到压缩流中(我不太熟悉 ZipFile
  • 使用PDF作为输出并简单地生成一个multipage PDF;这并不难,从长远来看可能会好得多。您仍然可以将该矢量图形结果转换为 PNG(或任何其他所需的像素格式9,但就目前而言,它 space 高效,可任意缩放并将所有页面保存在一个地方。导入选定页面很容易进入 LaTeX(事实上,\includegraphics 直接执行)或进入网站 (pdf.js)。

根据文档,matplotlib.pyplot.savefig accepts a binary file-like object. ZipFile.open 创建类似于对象的二进制文件。这两个必须在一起!

with zipobj.open(str(ii)+'um_slice.jpg', 'w') as fp: 
    plt.savefig(fp)