键在字典中时出现键错误
Key Error when key is in dictionary
只是试图从一堆照片的 EXIF 数据中提取一些 lat/lon 信息,但是代码抛出 KeyError
即使稍后(成功)使用该密钥打印特定坐标.
有问题的字典是“tags
” - 'GPS GPSLatitude'
和 'GPS GPSLongitude'
都是 tags.keys()
中的键;我已经检查了三次。
那么关于为什么 tags['GPS GPSLatitude']
和 tags['GPS GPSLongitude']
抛出关键错误的任何直觉?
import os
import exifread
output = dict()
output['name'] = []
output['lon'] = []
output['lat'] = []
for file in os.listdir(path):
if file.endswith(".JPG"):
full_path = path + file
print (file) #check to ensure all files were found
output['name'].append(file) #append photo name to dictionary
f = open(full_path, 'rb') #open photo
tags = exifread.process_file(f) #read exifdata
# lon = tags['GPS GPSLongitude'] #this + next line = one method
# output['lon'].append(lon)
# output['lat'].append(tags['GPS GPSLatitude']) # = cleaner second method
for tag in tags.keys():
if tag in ('GPS GPSLongitude','GPS GPSLatitude'):
print ("Key: %s, value %s" % (tag, tags[tag])) #successfully prints lat/lon coords with 'GPS GPSLongitude' and 'GPS GPSLatitude' as keys
更新:
这是 print (tags.keys())
的输出——您会在其中看到 GPS GPSLatitude
和 GPS GPSLongitude
。此外,手动检查我正在使用的子集中的所有照片都有 GPS 数据。
dict_keys(['GPS GPSImgDirection', 'EXIF SceneType', 'MakerNote Tag 0x0006', 'GPS GPSDestBearing', 'Thumbnail XResolution', 'EXIF BrightnessValue', 'GPS GPSAltitude', 'GPS GPSLongitude', 'EXIF LensSpecification', 'GPS GPSAltitudeRef', 'GPS GPSSpeedRef', 'GPS GPSDestBearingRef', 'EXIF WhiteBalance', 'Thumbnail ResolutionUnit', 'EXIF FocalLengthIn35mmFilm', 'EXIF SceneCaptureType', 'Image Model', 'MakerNote Tag 0x0008', 'Image Make', 'EXIF ShutterSpeedValue', 'MakerNote Tag 0x0007', 'EXIF ExifImageWidth', 'EXIF LensModel', 'Image YResolution', 'EXIF ComponentsConfiguration', 'Image GPSInfo', 'EXIF ISOSpeedRatings', 'EXIF ExposureMode', 'EXIF Flash', 'EXIF FlashPixVersion', 'GPS GPSLatitudeRef', 'EXIF ExposureBiasValue', 'Thumbnail JPEGInterchangeFormatLength', 'Thumbnail Compression', 'Image YCbCrPositioning', 'EXIF MakerNote', 'EXIF FNumber', 'JPEGThumbnail', 'MakerNote Tag 0x0001', 'EXIF ColorSpace', 'EXIF SubSecTimeDigitized', 'Thumbnail JPEGInterchangeFormat', 'MakerNote Tag 0x0004', 'EXIF SubjectArea', 'Image ResolutionUnit', 'EXIF SensingMethod', 'Image DateTime', 'Image Orientation', 'EXIF ExifVersion', 'Image ExifOffset', 'GPS GPSImgDirectionRef', 'MakerNote Tag 0x0014', 'Thumbnail YResolution', 'EXIF DateTimeOriginal', 'MakerNote Tag 0x0005', 'EXIF LensMake', 'EXIF DateTimeDigitized', 'MakerNote Tag 0x0003', 'GPS GPSTimeStamp', 'EXIF ExposureTime', 'GPS Tag 0x001F', 'EXIF SubSecTimeOriginal', 'GPS GPSLatitude', 'Image Software', 'EXIF ApertureValue', 'GPS GPSDate', 'EXIF ExposureProgram', 'GPS GPSSpeed', 'EXIF ExifImageLength', 'EXIF MeteringMode', 'GPS GPSLongitudeRef', 'EXIF FocalLength', 'Image XResolution'])
回溯
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-14-949ba89a1248> in <module>()
16 # lon = tags["GPS GPSLongitude"]
17 # output['lon'].append(lon)
---> 18 output['lat'].append(tags['GPS GPSLatitude'])
19 for tag in tags.keys():
20 if tag in ('GPS GPSLongitude','GPS GPSLatitude'):
KeyError: 'GPS GPSLatitude'
Link 转照片:https://drive.google.com/a/cornell.edu/file/d/0B1DwcbbAH1yuTEs0cUhhODdlNnc/view
这张照片的打印语句输出
IMG_6680.JPG
Key: GPS GPSLongitude, value [76, 29, 353/20]
Key: GPS GPSLatitude, value [42, 26, 5069/100]
GPS GPSLatitude
和 GPS GPSLongitude
可能不会出现在所有标签字典中。
除了访问密钥 tags['GPS GPSLatitude']
& tags['GPS GPSLongitude']
,您还可以访问这些密钥 tags.get('GPS GPSLatitude')
& tags.get('GPS GPSLongitude')
这将 return None
而不是抛出错误,您可以在其中应用 if-else 条件来验证这些键不存在的位置。
我认为@BryanOakley 的想法是正确的。如果密钥不在字典中,则它不存在。 (这些字段是可选的,有些文件可能没有数据。)因此您可以使用 dict.get(key, default=None)
方法,并将 Key Error 替换为默认值。
jpegs = [file for file in os.listdir(path) if file.endswith('.JPG')]
locns = []
for jpeg in jpegs:
with open(jpeg,'rb') as jpf:
exif = exifread.process_file(jpf)
lat = exif.get('GPS GPSLatitude', 'Not available')
lon = exif.get('GPS GPSLongitude', 'Not available')
locns.append((lat, lon))
只是试图从一堆照片的 EXIF 数据中提取一些 lat/lon 信息,但是代码抛出 KeyError
即使稍后(成功)使用该密钥打印特定坐标.
有问题的字典是“tags
” - 'GPS GPSLatitude'
和 'GPS GPSLongitude'
都是 tags.keys()
中的键;我已经检查了三次。
那么关于为什么 tags['GPS GPSLatitude']
和 tags['GPS GPSLongitude']
抛出关键错误的任何直觉?
import os
import exifread
output = dict()
output['name'] = []
output['lon'] = []
output['lat'] = []
for file in os.listdir(path):
if file.endswith(".JPG"):
full_path = path + file
print (file) #check to ensure all files were found
output['name'].append(file) #append photo name to dictionary
f = open(full_path, 'rb') #open photo
tags = exifread.process_file(f) #read exifdata
# lon = tags['GPS GPSLongitude'] #this + next line = one method
# output['lon'].append(lon)
# output['lat'].append(tags['GPS GPSLatitude']) # = cleaner second method
for tag in tags.keys():
if tag in ('GPS GPSLongitude','GPS GPSLatitude'):
print ("Key: %s, value %s" % (tag, tags[tag])) #successfully prints lat/lon coords with 'GPS GPSLongitude' and 'GPS GPSLatitude' as keys
更新:
这是 print (tags.keys())
的输出——您会在其中看到 GPS GPSLatitude
和 GPS GPSLongitude
。此外,手动检查我正在使用的子集中的所有照片都有 GPS 数据。
dict_keys(['GPS GPSImgDirection', 'EXIF SceneType', 'MakerNote Tag 0x0006', 'GPS GPSDestBearing', 'Thumbnail XResolution', 'EXIF BrightnessValue', 'GPS GPSAltitude', 'GPS GPSLongitude', 'EXIF LensSpecification', 'GPS GPSAltitudeRef', 'GPS GPSSpeedRef', 'GPS GPSDestBearingRef', 'EXIF WhiteBalance', 'Thumbnail ResolutionUnit', 'EXIF FocalLengthIn35mmFilm', 'EXIF SceneCaptureType', 'Image Model', 'MakerNote Tag 0x0008', 'Image Make', 'EXIF ShutterSpeedValue', 'MakerNote Tag 0x0007', 'EXIF ExifImageWidth', 'EXIF LensModel', 'Image YResolution', 'EXIF ComponentsConfiguration', 'Image GPSInfo', 'EXIF ISOSpeedRatings', 'EXIF ExposureMode', 'EXIF Flash', 'EXIF FlashPixVersion', 'GPS GPSLatitudeRef', 'EXIF ExposureBiasValue', 'Thumbnail JPEGInterchangeFormatLength', 'Thumbnail Compression', 'Image YCbCrPositioning', 'EXIF MakerNote', 'EXIF FNumber', 'JPEGThumbnail', 'MakerNote Tag 0x0001', 'EXIF ColorSpace', 'EXIF SubSecTimeDigitized', 'Thumbnail JPEGInterchangeFormat', 'MakerNote Tag 0x0004', 'EXIF SubjectArea', 'Image ResolutionUnit', 'EXIF SensingMethod', 'Image DateTime', 'Image Orientation', 'EXIF ExifVersion', 'Image ExifOffset', 'GPS GPSImgDirectionRef', 'MakerNote Tag 0x0014', 'Thumbnail YResolution', 'EXIF DateTimeOriginal', 'MakerNote Tag 0x0005', 'EXIF LensMake', 'EXIF DateTimeDigitized', 'MakerNote Tag 0x0003', 'GPS GPSTimeStamp', 'EXIF ExposureTime', 'GPS Tag 0x001F', 'EXIF SubSecTimeOriginal', 'GPS GPSLatitude', 'Image Software', 'EXIF ApertureValue', 'GPS GPSDate', 'EXIF ExposureProgram', 'GPS GPSSpeed', 'EXIF ExifImageLength', 'EXIF MeteringMode', 'GPS GPSLongitudeRef', 'EXIF FocalLength', 'Image XResolution'])
回溯
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-14-949ba89a1248> in <module>()
16 # lon = tags["GPS GPSLongitude"]
17 # output['lon'].append(lon)
---> 18 output['lat'].append(tags['GPS GPSLatitude'])
19 for tag in tags.keys():
20 if tag in ('GPS GPSLongitude','GPS GPSLatitude'):
KeyError: 'GPS GPSLatitude'
Link 转照片:https://drive.google.com/a/cornell.edu/file/d/0B1DwcbbAH1yuTEs0cUhhODdlNnc/view
这张照片的打印语句输出
IMG_6680.JPG
Key: GPS GPSLongitude, value [76, 29, 353/20]
Key: GPS GPSLatitude, value [42, 26, 5069/100]
GPS GPSLatitude
和 GPS GPSLongitude
可能不会出现在所有标签字典中。
除了访问密钥 tags['GPS GPSLatitude']
& tags['GPS GPSLongitude']
,您还可以访问这些密钥 tags.get('GPS GPSLatitude')
& tags.get('GPS GPSLongitude')
这将 return None
而不是抛出错误,您可以在其中应用 if-else 条件来验证这些键不存在的位置。
我认为@BryanOakley 的想法是正确的。如果密钥不在字典中,则它不存在。 (这些字段是可选的,有些文件可能没有数据。)因此您可以使用 dict.get(key, default=None)
方法,并将 Key Error 替换为默认值。
jpegs = [file for file in os.listdir(path) if file.endswith('.JPG')]
locns = []
for jpeg in jpegs:
with open(jpeg,'rb') as jpf:
exif = exifread.process_file(jpf)
lat = exif.get('GPS GPSLatitude', 'Not available')
lon = exif.get('GPS GPSLongitude', 'Not available')
locns.append((lat, lon))