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