Python 获得';非类型';对象没有属性';项目'&引用;PIL库出错

Python 获得';非类型';对象没有属性';项目'&引用;PIL库出错,python,python-3.x,python-imaging-library,Python,Python 3.x,Python Imaging Library,代码: 错误: #!/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)) 回溯(最近一次呼叫最后

代码:

错误:

#!/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))
回溯(最近一次呼叫最后一次):
文件“pythontool.py”,第7行,在
对于img._getexif().items()中的i,j:
AttributeError:“非类型”对象没有属性“项”
有人能帮我吗?我从未使用过PIL lib,但我看过一个教程, 此
.items()
方法在其中起作用:


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

首先,你不应该依赖内部函数,例如
\u get\u exif()
,因为它们的实现可以随时更改,并且通常不用于公共用途。(参见PEP8命名约定)

第二,你应该考虑并不是所有的图像都有EXIF数据。可能尝试获取EXIF数据将

None
。因此,问题不在于
.items()
方法,而在于您的
\u get\u exif()
返回了
None
。您的代码没有针对这种情况的处理,您总是假设
\u get\u exif()
返回一个
dict

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

从PIL导入图像,导出
img=Image.open(“sample.jpg”)
打印(目录(img))
#[…'getexif'…]
img_exif=img.getexif()
如果img_exif:
打印(类型(img_exif))
# 
打印(dict(img_exif))
#{..271:'富士胶片',305:'Adobe Photoshop Lightroom 6.14(Macintosh)'
img_exif_dict=dict(img_exif)
对于键,img_exif_dict.items()中的val:
如果输入ExifTags.TAGS:
打印(ExifTags.TAGS[键]+“-”+str(val))
其他:
打印(“对不起,图像没有exif数据。”)

非常感谢,这对我帮助很大!:)@5thAveApe和我更新了我的答案,添加了您的原始代码,您可以在
.items()
中循环并打印
ExifTags.TAGS[key]+“-”+str(val)
。这非常有用,不知道是否可以在文档中找到它。我搜索了很多,这是我发现的唯一一个参考资料,说明枕头中有一个公共方法,可以用来取代文档中提到的“实验性”下划线方法。@Karr是的,我在写这个答案时也在寻找关于它的文档,但我在地图上找不到它。我从source()找到了它,然后用
dir
验证了它。
Traceback (most recent call last):
  File "python-tool.py", line 7, in <module>
    for i, j in img._getexif().items():
AttributeError: 'NoneType' object has no attribute 'items'