Словарного ключа не существует, но он есть

Я использую exifread для получения информации Exif из фотографий.

В настоящее время я пытаюсь получить широту и долготу GPS, что я могу сделать:

def main():
    images = image_paths(IMAGE_FOLDER) # folder is say "Sample Photos\\"
    info = {}
    for img in images:
        _lat, _lon = "", ""
        tags = exifread.process_file(open(img,'rb'))       

        for i in tags.keys():
            if i == "GPS GPSLatitude":
                print(i, ":::", tags[i])

Это печатает то, что я ожидаю, это ключевое имя и значения:

GPS GPSLatitude ::: [32, 52, 66443/1250]
GPS GPSLatitude ::: [32, 52, 531699/10000]
GPS GPSLatitude ::: [32, 52, 531699/10000]
GPS GPSLatitude ::: [32, 52, 132789/2500]
GPS GPSLatitude ::: [32, 52, 265817/5000]

Но чтобы пропустить этот цикл и просто быстро получить пары ключ/значение, я пытаюсь вместо этого (это заменяет цикл for i ...)

_lon = tags["GPS GPSLatitude"]

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

KeyError: 'GPS GPSLatitude'

Как мне получить доступ к «GPS GPSLatitude» (и «GPS GPSLongitude»), не зацикливаясь на ключах tags?

Редактировать:

tags is <class 'dict'>


person BruceWayne    schedule 10.05.2018    source источник
comment
Не знаком с exifread, что такое type(tags)?   -  person pstatix    schedule 10.05.2018
comment
Вы уверены, что у каждого изображения есть тег? Ваш вывод будет совместим с некоторыми, у которых он есть, у некоторых нет.   -  person Paul Panzer    schedule 10.05.2018
comment
@hiroprotagonist: Похоже, что этот пробел исходит от print, который автоматически печатает пробел между аргументами, если не указано иное.   -  person user2357112 supports Monica    schedule 10.05.2018
comment
Вы печатаете только тогда, когда это конкретное изображение имеет этот тег, но вы зацикливаетесь на нескольких изображениях. Не у всех изображений есть этот тег, а если он отсутствует, печать невозможна.   -  person Martijn Pieters    schedule 10.05.2018
comment
@MartijnPieters - Черт возьми, это точно. Я добавил Try/Except и это исправило. Извините, что не заметил этого раньше :(   -  person BruceWayne    schedule 10.05.2018
comment
@RuudHelderman - Вау, как этот пост не появился, когда я искал ТАК?? Это точно.   -  person BruceWayne    schedule 10.05.2018


Ответы (2)


Возможно ли, что некоторые теги не имеют ключа 'GPS GPSLatitude'?

Может быть, вы можете попробовать

_lat = tags.get('GPS GPSLatitude', '')

Таким образом, _lat будет установлено значение широты, если оно существует, иначе будет установлено пустая строка.

person import han juuryoku    schedule 10.05.2018
comment
Да, это так. У большинства должен быть GPS, поэтому я и не подумал проверить, но видимо не у всех есть. Спасибо! (Также спасибо за то, что научили меня функции get(), очень удобно). - person BruceWayne; 10.05.2018

Если какое-либо изображение не имеет этого тега, вам необходимо обработать это исключение, чтобы предотвратить сбой. Например:

def main():
    images = image_paths(IMAGE_FOLDER) # folder is say "Sample Photos\\"
    info = {}
    for img in images:
        _lat, _lon = "", ""
        tags = exifread.process_file(open(img,'rb'))       

        try:
            _lon = tags["GPS GPSLongitude"]
            # _lat = tags["GPS GPSLatitude"]  # presumably you also want this
            # do something with these... perhaps add to info
        except KeyError:
            pass  # move on
person Arthur Dent    schedule 10.05.2018
comment
у вас опечатка, _lon не должно быть равно переменной Latitude, и бессмысленно инициировать обе переменные как пустые в каждом цикле, если вы просто собираетесь их перезаписать - person eagle; 10.05.2018
comment
Спасибо, @eagle --› был просто задуман как пример, но хорошо поймал опечатку. - person Arthur Dent; 11.05.2018