Python提取图片元数据报utf-8解码错误及filename路径问题咨询
PIL图片元数据提取脚本问题解答
1. UnicodeDecodeError触发原因与修复方案
报错原因
- 你代码中
data.decode()默认使用UTF-8编码解码EXIF字段的字节数据,但EXIF标准并未强制要求文本字段使用UTF-8编码:- 旧款数码相机、早期修图软件生成的EXIF文本通常使用Latin-1(ISO-8859-1)、GBK等编码;
- 部分EXIF字段存储的是纯二进制内容(比如嵌入的缩略图、厂商自定义的二进制参数、GPS原始数据片段),本身就不是可直接转成可读文本的内容;
- 你遇到的
0x80字节不属于UTF-8编码的合法起始字节,因此触发解码报错。
修复方法
将原脚本中直接解码字节的逻辑替换为多编码兼容+错误兜底的逻辑,避免单文件报错导致整个脚本中断,替换的代码段如下:
# 原代码 # if isinstance(data, bytes): # data = data.decode() # 替换为以下逻辑 if isinstance(data, bytes): decoded = None # 按优先级尝试常见编码解码 for enc in ("utf-8", "gbk", "latin-1"): try: decoded = data.decode(enc) break except UnicodeDecodeError: continue # 所有编码解码失败则标记为二进制数据 data = decoded if decoded is not None else f"[不可读二进制数据,长度{len(data)}字节]"
- 额外建议:遍历EXIF标签时可以提前过滤已知的二进制类标签(比如缩略图相关的
ThumbnailData、厂商自定义的MakerNote),进一步减少无效解码操作。
2. image.filename属性的路径返回规则
image.filename不保证一定返回绝对路径:该属性的返回值和你调用Image.open()时传入的路径参数完全一致——传入相对路径则返回相对路径,传入绝对路径才会返回绝对路径。- 你当前脚本中因为用
os.path.join(rootdir, file)拼接了绝对路径传入Image.open(),所以测试时拿到的是绝对路径。如果需要稳定获取文件的绝对路径,可以在读取图片后主动调用os.path.abspath(image.filename)做一次标准化转换。
内容的提问来源于stack exchange,提问作者Edward Wynman
相关产品推荐
相关产品推荐

