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 本身就不保留。 - 拍摄时间字段在不同相机里可能叫
DateTimeOriginal或DateTime,都试一下。

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