Python遍历图片元数据触发KeyError: 'dpi'问题求助
问题解决
核心问题分析
- KeyError: 'dpi':并非所有图片都包含DPI元数据,直接通过
image.info['dpi']访问会触发键不存在的错误。 - 缩进错误:元数据提取和文件写入代码不在
for循环内部,导致脚本只会处理最后一个文件,而非遍历所有文件。 - 缺乏异常处理:未处理非图片文件、损坏图片等情况,会导致脚本中途崩溃。
- 文件资源未正确管理:直接用
open()打开文件未确保关闭,可能引发资源泄漏。
修复后的完整代码
import os from PIL import Image PIL.Image.MAX_IMAGE_PIXELS = 384000000 rootdir = r"C:\Users\edward\OneDrive\Pics" # 使用with语句自动管理文件资源,避免泄漏 with open('meta.txt', 'w') as newfile: # 写入表头,对齐格式 header = ( "Filename | Image DPI | Image Height " "| Image Width | Image Format | Image Mode | Image Frames |\n" ) newfile.write(header) for file in os.listdir(rootdir): file_path = os.path.join(rootdir, file) # 跳过目录,只处理文件 if not os.path.isfile(file_path): continue try: # 打开图片并提取元数据 with Image.open(file_path) as image: # 使用get方法处理DPI不存在的情况,默认值设为"N/A" info_dict = { "Filename": os.path.basename(file_path), "Image DPI": image.info.get('dpi', 'N/A'), "Image Height": image.height, "Image Width": image.width, "Image Format": image.format, "Image Mode": image.mode, "Frames in Image": getattr(image, "n_frames", 1) } # 格式化输出行,保持对齐 line = "" for value in info_dict.values(): line += f"|{str(value):<28} " line += "|\n" newfile.write(line) except Exception as e: # 捕获所有处理失败的情况,记录错误信息并继续处理下一个文件 error_line = f"|{file:<28} |Error: {str(e):<26} |- |- |- |- |- |\n" newfile.write(error_line) print(f"处理文件 {file} 失败: {e}")
关键修改说明
- 处理DPI缺失:用
image.info.get('dpi', 'N/A')替代直接索引,当没有dpi键时返回默认值N/A,避免KeyError。 - 修正缩进:将元数据提取、写入代码移至
for循环内部,确保每个文件都被处理。 - 异常捕获:添加
try-except块,处理无法打开的文件、损坏图片等异常,脚本不会中途终止。 - 文件资源管理:用
with语句打开文件和图片,自动释放资源,避免内存泄漏。 - 跳过目录:添加
os.path.isfile()判断,避免尝试处理目录。 - 格式化优化:调整字符串对齐宽度,让输出表格更整齐。
内容的提问来源于stack exchange,提问作者Edward Wynman
相关产品推荐
相关产品推荐

