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

使用Python和PIL提取图片GPS数据时触发AttributeError报错

问题根本原因

网上流传的这段旧代码本身存在版本适配缺陷,报错核心原因有两点:

  • Pillow库API行为变更:Pillow 6.0之前的版本中,Image.getexif() 会自动递归解析嵌套的EXIF目录,此时顶层返回结果里的GPSInfo字段直接是存储GPS参数的字典,旧代码就是基于这个版本的行为编写的。从Pillow 6.2.0版本开始,getexif() 默认不再自动解析嵌套的IFD(图像文件目录),顶层字典里GPSInfo(标签ID为34853)对应的值只是GPS数据在EXIF块中的偏移量整数(就是你打印看到的90),不是实际的GPS键值对,直接对整数调用.keys()方法必然抛出属性错误。
  • 测试文件本身无有效GPS数据:你使用的是截图文件,绝大多数设备生成的截图、社交平台传输后压缩的图片,都会剥离GPS元数据,就算代码逻辑正确,这类文件也读不到有效经纬度信息。
正确实现方案

获取GPS信息需要调用EXIF对象的get_ifd()方法,传入GPSInfo对应的标签ID34853来拉取嵌套的GPS数据,同时增加存在性判断,兼容无GPS信息的图片。修正后的可运行代码如下:

from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS   
filename = "screenshot.jpg"

def get_exif(image_file_path):
    exif_table = {}
    image = Image.open(image_file_path)
    exif_data = image.getexif()
    # 解析顶层EXIF标签
    for tag, value in exif_data.items():
        decoded_tag = TAGS.get(tag, tag)
        exif_table[decoded_tag] = value
    # 解析嵌套GPS数据
    gps_info = {}
    if 34853 in exif_data:
        for key, value in exif_data.get_ifd(34853).items():
            decoded_gps_tag = GPSTAGS.get(key, key)
            gps_info[decoded_gps_tag] = value
    exif_table['GPSInfo'] = gps_info
    return gps_info

if __name__ == "__main__":
    gps_data = get_exif(filename)
    print(gps_data)

补充说明

  • 运行上述代码测试你的截图文件,会输出空字典,属于正常现象,替换为带拍摄位置信息的原相机照片即可拿到解析后的经纬度等GPS参数。
  • 不要直接通过exif_table['GPSInfo']硬取值,不含位置信息的图片不存在该标签,直接索引会触发KeyError。

内容的提问来源于stack exchange,提问作者user153624

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:21:36