获取“NoneType”对象没有属性“items”时出错

2024-04-20 09:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

代码:

#!/usr/bin/python3

from PIL import Image, ExifTags

img = Image.open("/root/Bilder/sysPics/schwarz-weiß-Karte.jpg")

for i, j in img._getexif().items():
    if i in ExifTags.TAGS:
        print(ExifTags.TAGS[i] + " - " + str(j))

错误:

^{pr2}$

有人能帮我吗?我从没用过PIL lib,但我看过一个教程, 其中.items()方法起作用:

https://www.youtube.com/watch?v=-PiR5SX4Mxo&list=PLNmsVeXQZj7onbtIXvxZTzeKGnzI6NFp_&index=8

他的代码和我的代码没有区别,我不敢相信他们在最后的补丁中切断了.items()方法。在


Tags: 方法代码infromimageimportimgbin
1条回答
网友
1楼 · 发布于 2024-04-20 09:15:57

首先,您不应该依赖于内部函数,如_get_exif(),因为它们的实现随时可能更改,而且它们通常不用于公共用途。(请参见PEP8命名约定中的^{})。在

第二,你应该考虑到并不是所有的图像都有EXIF数据。尝试获取EXIF数据可能会None。所以问题不是.items()方法,而是你的_get_exif()返回了{}。您的代码不能处理这种情况,您总是假定_get_exif()返回dict。在

现在,为了解决您的问题,对于Python3.x(我有Python3.6.8)和PIL(作为枕头安装,Pillow==6.0.0),现在,Image对象提供了一个可以使用的公共getexif()方法。如果图像没有EXIF数据或<class 'PIL.Image.Exif'>,则返回类型为None。在

from PIL import Image, ExifTags

img = Image.open("sample.jpg")
print(dir(img))
# [... 'getexif' ...]

img_exif = img.getexif()
if img_exif:
    print(type(img_exif))
    # <class 'PIL.Image.Exif'>
    print(dict(img_exif))
    # { .. 271: 'FUJIFILM', 305: 'Adobe Photoshop Lightroom 6.14 (Macintosh)', }

    img_exif_dict = dict(img_exif)
    for key, val in img_exif_dict.items():
        if key in ExifTags.TAGS:
            print(ExifTags.TAGS[key] + " - " + str(val))
else:
    print("Sorry, image has no exif data.")

相关问题 更多 >