You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历图片元数据触发KeyError: 'dpi'问题求助

问题解决

核心问题分析

  1. KeyError: 'dpi':并非所有图片都包含DPI元数据,直接通过image.info['dpi']访问会触发键不存在的错误。
  2. 缩进错误:元数据提取和文件写入代码不在for循环内部,导致脚本只会处理最后一个文件,而非遍历所有文件。
  3. 缺乏异常处理:未处理非图片文件、损坏图片等情况,会导致脚本中途崩溃。
  4. 文件资源未正确管理:直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:15:37