Python存储多个numpy数组为JPG时文件缺失问题(根源为缩进)
解决批量保存频谱图numpy矩阵时的文件缺失问题
最近我在处理音频信号频谱图的二维numpy矩阵,需要把一个包含6个不同矩阵的列表splits里的每个元素都保存成单独的图片文件。最开始我写了一段循环代码,但运行后发现总是有文件缺失,折腾了半天才发现居然只是缩进问题!
最初的错误代码
我一开始的代码是这样的:
counter = 0 for item in splits: counter = counter + 1 print counter pic_name = "path/" + str(counter) +"_.jpg" matplotlib.image.imsave(pic_name, item)
问题根源
这段代码的问题非常隐蔽——循环体内的语句没有正确缩进!在Python中,缩进是区分代码块的关键,没有缩进的话,counter递增、文件名生成和图片保存这些逻辑都不在循环里,只会执行一次。最终要么只有最后一个矩阵被保存,要么直接报错,自然会出现文件缺失的情况。
修复后的正确代码
把循环内的语句都缩进4个空格(或者一个制表符),就能正常批量保存所有图片了:
import matplotlib.image as mpimg counter = 0 for item in splits: counter = counter + 1 print(counter) # Python3需要加括号,Python2可以省略 pic_name = "path/" + str(counter) + "_.jpg" mpimg.imsave(pic_name, item)
更简洁的优化写法
其实我们可以用enumerate来自动维护计数器,不用手动管理counter变量,代码会更清晰:
import matplotlib.image as mpimg # enumerate的start参数设为1,让文件名从1开始编号 for idx, item in enumerate(splits, start=1): # 用f-string拼接文件名更简洁直观 pic_name = f"path/{idx}_.jpg" mpimg.imsave(pic_name, item)
另外,为了避免因为保存目录不存在导致的保存失败,还可以提前创建目录:
import os import matplotlib.image as mpimg save_dir = "path/" # 检查目录是否存在,不存在则创建 if not os.path.exists(save_dir): os.makedirs(save_dir) for idx, item in enumerate(splits, start=1): # 用os.path.join拼接路径,更适配不同操作系统 pic_name = os.path.join(save_dir, f"{idx}_.jpg") mpimg.imsave(pic_name, item)
内容的提问来源于stack exchange,提问作者Jose Ramon
相关产品推荐
相关产品推荐

