我的知识记录

Python 批量提取图片 EXIF 信息:拍摄时间相机型号 GPS 教程

用 Python Pillow 批量读取图片 EXIF 元数据,提取拍摄时间、相机型号、焦距、光圈、GPS 坐标,导出成 CSV 表格,附完整代码和字段说明。

场景痛点

整理旅行照片、归档素材时,想知道每张图用什么相机拍的、几点几分拍的、GPS 在哪。一张张右键属性看,几十上百张图要点到崩溃。更麻烦的是上传网站前还得把 EXIF 里的 GPS 位置删掉,避免泄露隐私。用 Python 批量读 EXIF,一键导出成 CSV,想删哪张删哪张。

用到的库

pip install Pillow

完整代码

import os
import csv
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

SRC_EXTS = (".jpg", ".jpeg", ".tiff")  # PNG 一般不含 EXIF


def get_exif(img_path):
"""读取图片 EXIF,返回 {可读字段名: 值} 字典"""
img = Image.open(img_path)
exif_raw = img.getexif()
if not exif_raw:
return {}

result = {}
for tag_id, value in exif_raw.items():
tag_name = TAGS.get(tag_id, tag_id)
result[tag_name] = value

# GPS 信息单独解码
gps_info = exif_raw.get_ifd(0x8825)
gps_decoded = {}
for k, v in gps_info.items():
gps_decoded[GPSTAGS.get(k, k)] = v
if gps_decoded:
result["GPSInfo"] = gps_decoded
return result


def batch_export(src_dir, csv_path):
"""批量读取目录下所有图片 EXIF,导出成 CSV"""
rows = []
for root, _, files in os.walk(src_dir):
for name in sorted(files):
if not name.lower().endswith(SRC_EXTS):
continue
path = os.path.join(root, name)
try:
exif = get_exif(path)
except Exception as e:
exif = {"Error": str(e)}
rows.append({
"文件路径": path,
"相机厂商": exif.get("Make", ""),
"相机型号": exif.get("Model", ""),
"拍摄时间": exif.get("DateTimeOriginal", ""),
"镜头": exif.get("LensModel", ""),
"ISO": exif.get("ISOSpeedRatings", ""),
"GPS": exif.get("GPSInfo", ""),
})

with open(csv_path, "w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()) if rows else [])
writer.writeheader()
writer.writerows(rows)
print(f"共处理 {len(rows)} 张,结果写入 {csv_path}")


def main():
batch_export("./photos", "./exif.csv")


if __name__ == "__main__":
main()

代码讲解

  • img.getexif() 返回 EXIF 字典,key 是数字 ID,value 是原始值。用 TAGS 字典把数字 ID 翻译成可读字段名,比如 0x010F 翻译成 Make(厂商)。
  • GPS 信息在单独的 IFD 目录里,要用 get_ifd(0x8825) 再取一层,再用 GPSTAGS 解码。
  • 常用字段:Make 相机厂商、Model 型号、DateTimeOriginal 拍摄时间、LensModel 镜头、ISOSpeedRatings 感光度。
  • CSV 用 utf-8-sig 编码,Excel 直接双击打开中文不乱码。
  • PNG 截图类图片一般不含 EXIF,脚本只扫 jpg/tiff,跳过 png/webp。

运行结果

运行后生成 ./exif.csv,用 Excel 打开,每行对应一张图,列出文件路径、相机厂商、型号、拍摄时间、镜头、ISO、GPS。没有 EXIF 的图对应字段为空。

注意事项

  • 微信、QQ 发过的图、社交媒体下载的图,平台会自动剥掉 EXIF,读出来是空的,这不是脚本问题。
  • GPS 坐标是度分秒格式的元组,CSV 里看是一坨,要转成十进制度数需要自己换算。
  • getexif() 是 Pillow 6.0 以后的新 API,老版本用 _getexif(),建议升级 Pillow。
  • 想删除 EXIF 保护隐私:Image.open(p).save(out) 重新存一遍,新文件不带 EXIF;WebP、PNG 本身就不保留。
  • 拍摄时间字段在不同相机里可能叫 DateTimeOriginalDateTime,都试一下。

Python 批量提取图片 EXIF 信息:拍摄时间相机型号 GPS 教程

标签:

更新时间:2026-09-14 20:43:31

上一篇:Python 批量修改图片尺寸:等比缩放不拉伸教程

下一篇:Python 批量生成缩略图:网站列表页快速预览图教程