Получение объекта «NoneType» не имеет атрибута «items» с ошибкой в ​​библиотеке PIL - PullRequest
1 голос
/ 12 июня 2019

код:

#!/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))

Ошибка:

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'

Кто-нибудь может мне помочь? Я никогда не работал с библиотекой PIL, но я видел учебник, в котором этот .items() метод работал:

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

Нет разницы между его кодом и моим, я не могу поверить, что они отключили метод .items() в последних патчах.

1 Ответ

1 голос
/ 13 июня 2019

1-й, вы не должны полагаться на внутренние функции, такие как _get_exif(), потому что их реализация может измениться в любое время, и они обычно не предназначены для публичного использования. (См. _single_leading_underscore из соглашений об именах PEP8).

2-й, вы должны учитывать, что не все изображения имеют данные EXIF. Возможно, что попытка получить данные EXIF ​​будет None. Так что проблема не в методе .items(), а в том, что ваш _get_exif() вернул None. Ваш код не имеет обработки для этого случая, вы всегда предполагаете, что _get_exif() возвращает dict.

Теперь, чтобы решить вашу проблему, для Python3.x (у меня есть Python3.6.8) и PIL (установлен как Pillow, Pillow==6.0.0), объект Image теперь предоставляет открытый метод getexif(), который вы можете использовать , Тип возвращаемого значения - None, если изображение не содержит данных EXIF, или <class 'PIL.Image.Exif'>.

.
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.")
...