Почему я получаю RuntimeError: ключи словаря изменены во время работы - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу получить координаты из GPS-метаданных изображения, но на 9-й строке

for key, value in exif.items():

Я получаю сообщение об ошибке:

RuntimeError: dictionary keys are changed during the operation

from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS


def get_exif(filename):
    exif = Image.open(filename)._getexif()

    if exif is not None:
        for key, value in exif.items():
            name = TAGS.get(key, key)
            exif[name] = exif.pop(key)

        if 'GPSInfo' in exif:
            for key in exif['GPSInfo'].keys():
                name = GPSTAGS.get(key,key)
                exif['GPSInfo'][name] = exif['GPSInfo'].pop(key)

    return exif

exif = get_exif('YOUR_IMAGE.JPG_HERE')



def get_decimal_coordinates(info):
    for key in ['Latitude', 'Longitude']:
        if 'GPS'+key in info and 'GPS'+key+'Ref' in info:
            e = info['GPS'+key]
            ref = info['GPS'+key+'Ref']
            info[key] = ( e[0][0]/e[0][1] +
                          e[1][0]/e[1][1] / 60 +
                          e[2][0]/e[2][1] / 3600
                        ) * (-1 if ref in ['S','W'] else 1)

    if 'Latitude' in info and 'Longitude' in info:
        return [info['Latitude'], info['Longitude']]



get_decimal_coordinates(exif['GPSInfo'])

1 Ответ

1 голос
/ 29 февраля 2020

Вы вносите изменения в словарь, просматривая его в exif[name] = exif.pop(key). Это не только ошибка времени выполнения, но и анти-шаблон. Поскольку вы обращаетесь к словарю внутри для l oop, любые изменения в словаре сделают бесполезным для l oop и, следовательно, RuntimeError. Для вашего случая использования, похоже, что вы пытаетесь (как бы) перевернуть словарь, то есть превратить ключи в значения, и наоборот, вы можете легко сделать это с помощью словарного понимания

exif = {TAGS.get(key, key): key for key, value in exif.items()}

и аналогично для остальных l oop.

...