Python批量根据CSV更新JPG图片Metadata Comments的实现咨询
批量更新JPG图片元数据注释解决方案
原代码核心问题
- 未给每张图片匹配对应的注释内容,直接对整个DataFrame列调用
encode方法触发类型错误 - 冗余使用
ListImage.csv,无需单独读取目录文件名做合并,直接用FinalImageMetaData.csv的文件名映射即可 - 文件读写逻辑错误,以只读二进制模式打开文件后无法直接写入修改内容
- 未处理无原生EXIF信息的图片异常场景
- 路径写法不规范,容易触发文件找不到错误
优化解决思路
- 直接将
FinalImageMetaData.csv读取为「文件名:注释内容」的映射字典,省略合并步骤 - 遍历字典内的文件名,逐个匹配目录下的图片文件
- 增加EXIF不存在的兼容逻辑,自动初始化空白EXIF结构
- 可选备份原图片,避免操作失误损坏原图
- 处理注释内容两端的多余空白字符后再编码写入
可行代码片段
from PIL import Image import piexif import pandas as pd import os # 配置参数,按实际情况修改 IMAGE_DIR = r"C:\你的图片目录完整路径" # 替换为JPG和CSV文件所在的实际目录 BACKUP = True # 开启后修改后的图片存为新文件、原文件保留,建议开启 # 读取CSV生成文件名到注释的映射字典 CSV_PATH = os.path.join(IMAGE_DIR, "FinalImageMetaData.csv") meta_df = pd.read_csv(CSV_PATH) # 去除字段两端多余空白字符 meta_dict = dict(zip(meta_df['IMAGE_NAME'].str.strip(), meta_df['METADATA'].str.strip())) for img_name, comment in meta_dict.items(): img_path = os.path.join(IMAGE_DIR, img_name) if not os.path.exists(img_path): print(f"跳过不存在的文件:{img_name}") continue # 读取图片 im = Image.open(img_path) # 加载EXIF,不存在则初始化空白结构 if "exif" in im.info: exif_dict = piexif.load(im.info["exif"]) else: exif_dict = {"0th": {}, "Exif": {}, "GPS": {}, "1st": {}, "thumbnail": None} # 写入注释,必须用utf-16le编码才能在Windows属性中正常显示 exif_dict["0th"][piexif.ImageIFD.XPComment] = comment.encode('utf-16le') exif_bytes = piexif.dump(exif_dict) # 保存文件 if BACKUP: save_path = os.path.join(IMAGE_DIR, f"modified_{img_name}") else: save_path = img_path im.save(save_path, exif=exif_bytes) print(f"已处理:{img_name}") print("所有匹配文件处理完成")
注意事项
- 不需要备份原文件时,将
BACKUP参数改为False即可直接覆盖原图 - 只有CSV文件中存在的文件名才会被处理,未匹配到的图片不会被修改
内容的提问来源于stack exchange,提问作者Johnjhang
相关产品推荐
相关产品推荐

