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

Python批量根据CSV更新JPG图片Metadata Comments的实现咨询

批量更新JPG图片元数据注释解决方案

原代码核心问题

  • 未给每张图片匹配对应的注释内容,直接对整个DataFrame列调用encode方法触发类型错误
  • 冗余使用ListImage.csv,无需单独读取目录文件名做合并,直接用FinalImageMetaData.csv的文件名映射即可
  • 文件读写逻辑错误,以只读二进制模式打开文件后无法直接写入修改内容
  • 未处理无原生EXIF信息的图片异常场景
  • 路径写法不规范,容易触发文件找不到错误

优化解决思路

  1. 直接将FinalImageMetaData.csv读取为「文件名:注释内容」的映射字典,省略合并步骤
  2. 遍历字典内的文件名,逐个匹配目录下的图片文件
  3. 增加EXIF不存在的兼容逻辑,自动初始化空白EXIF结构
  4. 可选备份原图片,避免操作失误损坏原图
  5. 处理注释内容两端的多余空白字符后再编码写入

可行代码片段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:51:03