
本文详解如何使用 Pillow 正确读取和写入 XMP 标签(如 PreservedFileName、dc:Title),解决 EXIF 与 XMP 混淆导致的元数据不可见问题,并提供可运行代码、注意事项及生产级实践建议。
本文详解如何使用 pillow 正确读取和写入 xmp 标签(如 `preservedfilename`、`dc:title`),解决 exif 与 xmp 混淆导致的元数据不可见问题,并提供可运行代码、注意事项及生产级实践建议。
XMP(Extensible Metadata Platform)是 Adobe 主导的现代元数据标准,以嵌入式 XML 形式存储在 JPEG、TIFF、PNG 等图像文件中,支持自定义命名空间(如 xmpMM:PreservedFileName、dc:Title),广泛用于数字资产管理(DAM)、AI 打标固化、重命名备份等场景。但需明确一点:XMP ≠ EXIF——PIL 的 getexif() 只能访问传统 TIFF/EXIF IFD 结构,完全无法触达 XMP 段;若强行调用,你看到的只是相机参数、时间戳等底层硬件信息(正如提问中输出的 36864, 37121 等数值键),而你的 PreservedFileName 和 Title 早已安静地躺在独立的 XMP 数据块里。
✅ 正确做法是使用 Pillow 内置的 getxmp() 方法:
from PIL import Image
img = Image.open("P1050122.jpg")
xmp_data = img.getxmp()
# 查看完整结构(含命名空间)
print(xmp_data)执行后将输出类似结构(已简化):
{
'xmpmeta': {
'xmptk': 'Image::ExifTool 12.76',
'RDF': {
'Description': [
{
'about': '',
'title': {'Alt': {'li': {'lang': 'x-default', 'text': 'P1050122'}}}
},
{
'about': '',
'PreservedFileName': 'P1050122.jpg'
}
]
}
}
}? 注意字段路径:
-
dc:Title→ 对应xmp_data['xmpmeta']['RDF']['Description'][0]['title'] -
xmpMM:PreservedFileName→ 对应xmp_data['xmpmeta']['RDF']['Description'][1]['PreservedFileName']
⚠️ 重要前提:Pillow 需依赖 defusedxml 安全解析 XML。若报错 ModuleNotFoundError: No module named 'defusedxml',请先安装:
pip install --upgrade defusedxml
(推荐使用 defusedxml 而非原生 xml.etree,因其默认禁用外部实体、防止 XXE 攻击,符合生产环境安全规范)
? 写入 XMP 尚不被 Pillow 原生支持(截至 Pillow 10.3+)。如需写入(例如批量还原原始文件名、注入 AI 生成标签),必须回退至 exiftool 命令行——这是当前最可靠、跨格式(JPEG/PNG/HEIC/WebP)、可审计的工业级方案:
# ✅ 安全写入:保留原图像素,仅更新 XMP
exiftool -P -overwrite_original_in_place \
"-XMP-xmpMM:PreservedFileName<Filename" \
"-XMP-dc:Title<${filename;s/\.[^.]*$//}" \
"P1050122.jpg"
# ✅ 批量处理所有 JPG(含子目录)
exiftool -P -overwrite_original_in_place \
"-XMP-xmpMM:PreservedFileName<Filename" \
"-XMP-dc:Title<${filename;s/\.[^.]*$//}" \
-r ./photos/? 进阶提示:
- 若你正构建「AI 图片标签工坊」类工具(如 DeepSeek 自动打标 + 文件名固化),XMP 是比文件名更健壮的标签载体:它支持多语言、特殊字符、结构化数组(如
xmp:Keywords),且不破坏文件系统兼容性; -
exiftool写入时建议始终加-P(preserve file timestamps)和-overwrite_original_in_place(零拷贝就地更新),避免生成临时文件或破坏 NAS 同步状态; - 对于隐私敏感场景(如对外发布前清理),务必确认
exiftool -listw显示的写入能力是否包含XMP——部分老旧版本可能默认跳过 XMP 写入。
总结:Pillow 是读取 XMP 的轻量之选,适合校验、展示、辅助决策;而 exiftool 是写入与工程落地的黄金标准。二者协同,恰好构成「读–判–写」闭环:用 Pillow 快速扫描千张图中的 PreservedFileName 是否存在,再用 exiftool 精准注入 AI 标签并固化到文件名——让每一张图片真正成为自带语义、可搜索、可迁移的数字资产。

















