Just trying to pull some lat/lon info from EXIF data on a bunch of photos, but code is throwing a KeyError
even though that key is used (successfully) later on to print specific coordinates.
Dictionary in question is "tags
" - 'GPS GPSLatitude'
and 'GPS GPSLongitude'
are both keys in tags.keys()
; I've triple checked.
So any intuition on why tags['GPS GPSLatitude']
& tags['GPS GPSLongitude']
are throwing key errors?
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
UPDATE:
Here's the output of print (tags.keys())
-- you'll see GPS GPSLatitude
and GPS GPSLongitude
in there. Also, have manually checked all the photos in the subset I'm using have GPS data.
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'])
Traceback
---------------------------------------------------------------------------
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 to photo: https://drive.google.com/a/cornell.edu/file/d/0B1DwcbbAH1yuTEs0cUhhODdlNnc/view
Output of the print statement for this photo
IMG_6680.JPG
Key: GPS GPSLongitude, value [76, 29, 353/20]
Key: GPS GPSLatitude, value [42, 26, 5069/100]
GPS GPSLatitude
and GPS GPSLongitude
may not be present in all tag dicts.
Instead of accessing keys as tags['GPS GPSLatitude']
& tags['GPS GPSLongitude']
, you can also access these as tags.get('GPS GPSLatitude')
& tags.get('GPS GPSLongitude')
This wil return None
instead of throwing error, where you can apply if-else condition also to verify where these keys are not present.
I think @BryanOakley has the right idea. If the key isn't in the dict, it isn't there. (Those fields are optional, and some files might not have the data.) So you can use the dict.get(key, default=None)
approach, and replace the Key Error with a default value.
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))
来源:https://stackoverflow.com/questions/37143664/key-error-when-key-is-in-dictionary