使用Pillow获取图片XPKeywords(40094)元数据仅部分生效问题
解决XPKeywords(EXIF标签40094)无法读取的问题
问题核心
你的Python脚本通过PIL的getexif()读取图片XPKeywords(标签40094)元数据,仅部分图片生效——系统属性显示该字段有数据,但脚本输出中无40094标签;手动修改图片关键词后,脚本可正常读取。已尝试降级PIL、更换piexif模块,问题依旧。
可能原因
- 元数据存储位置差异:系统属性会合并显示EXIF、XMP、IPTC中的关键词,但PIL的
getexif()仅读取EXIF数据。若Lightroom将关键词写入XMP(而非EXIF的XPKeywords字段),脚本自然读不到。 - Lightroom元数据写入策略:部分Lightroom版本默认仅将关键词写入XMP侧栏,不更新EXIF的XPKeywords字段,导致脚本无法通过EXIF读取。
- 字段标准不统一:XPKeywords是Windows特有的EXIF字段,部分工具会将关键词存入IPTC的
Keywords(标签2:025)或XMP的dc:subject,系统属性统一显示这些字段,但脚本仅查询40094标签会遗漏。
解决方案
1. 扩展脚本,同时读取多位置元数据
不要仅依赖EXIF的40094标签,同时读取XMP、IPTC中的关键词字段,合并结果。推荐使用pyexiv2库(支持读取XMP/IPTC),示例代码:
import pyexiv2 from PIL import Image def getStudents(image_path): # 读取EXIF的XPKeywords(40094) img = Image.open(image_path) exif_data = img.getexif() xp_keywords = exif_data.get(40094, "") xp_list = xp_keywords.split(';') if xp_keywords else [] # 读取XMP和IPTC的关键词 with pyexiv2.Image(image_path) as img_meta: # XMP的dc:subject字段 xmp_data = img_meta.read_xmp() xmp_list = xmp_data.get('Xmp.dc.subject', []) # IPTC的Keywords字段 iptc_data = img_meta.read_iptc() iptc_list = iptc_data.get('Iptc.Application2.Keywords', []) # 合并并去重关键词 all_keywords = list(set(xp_list + xmp_list + iptc_list)) return all_keywords
安装依赖:
pip install pyexiv2 pillow
2. 调整Lightroom元数据导出设置
确保Lightroom导出时将关键词写入EXIF的XPKeywords字段:
- 导出图片时,进入「元数据」选项卡
- 选择「所有元数据」,或自定义设置并勾选「EXIF」相关选项
- 若需要同步已有图片的元数据,可在Lightroom中选中图片,执行「元数据 > 将元数据写入文件」
3. 批量同步元数据到XPKeywords
使用ExifTool批量将XMP/IPTC的关键词同步到EXIF的XPKeywords字段,适合处理已有图片:
# 批量将IPTC/EXIF/XMP的关键词同步到XPKeywords exiftool "-XPKeywords<Keywords" /path/to/your/images
内容的提问来源于stack exchange,提问作者Beu777
相关产品推荐
相关产品推荐

