2017-07-17 58 views
0

我試圖做GPS EXIF數據的質量提取,我的代碼沒有Exif數據中:Python中,忽略文件下面

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

def get_exif_data(image): 
    exif_data = {} 
    info = image._getexif() 
    if info: 
     for tag, value in info.items(): 
      decoded = TAGS.get(tag, tag) 
      if decoded == "GPSInfo": 
       gps_data = {} 
       for t in value: 
        sub_decoded = GPSTAGS.get(t, t) 
        gps_data[sub_decoded] = value[t] 

       exif_data[decoded] = gps_data 
      else: 
       exif_data[decoded] = value 

    return exif_data 

def _get_if_exist(data, key): 
    if key in data: 
     return data[key] 
    else: 
     pass 

def get_lat_lon(exif_data): 
    gps_info = exif_data["GPSInfo"] 
    lat = None 
    lon = None 

    if "GPSInfo" in exif_data: 
     gps_info = exif_data["GPSInfo"] 

     gps_latitude = _get_if_exist(gps_info, "GPSLatitude") 
     gps_latitude_ref = _get_if_exist(gps_info, "GPSLatitudeRef") 
     gps_longitude = _get_if_exist(gps_info, "GPSLongitude") 
     gps_longitude_ref = _get_if_exist(gps_info, "GPSLongitudeRef") 

     if gps_latitude and gps_latitude_ref and gps_longitude and gps_longitude_ref: 
      lat = _convert_to_degrees(gps_latitude) 
      if gps_latitude_ref != "N": 
       lat = 0 - lat 

      lon = _convert_to_degrees(gps_longitude) 
      if gps_longitude_ref != "E": 
       lon = 0 - lon 

     return lat, lon 

Code source

其上運行,如:

if __name__ == "__main__": 
    image = Image.open("photo directory") 
    exif_data = get_exif_data(image) 
    print(get_lat_lon(exif_data) 

這適用於一張照片,因此我使用glob遍歷文件中的所有照片:

import glob 
file_names = [] 
for name in glob.glob(photo directory): 
    file_names.append(name) 

for item in file_names: 
    if __name__ == "__main__": 
     image = Image.open(item) 
     exif_data = get_exif_data(image) 
     print(get_lat_lon(exif_data)) 
    else: 
     pass 

哪些工作正常,只要文件中的每張照片是a)圖像和b)具有gps數據。我曾嘗試在_get_if_exist函數以及我的文件迭代中添加通行證,但是,兩者都不會產生任何影響,並且我仍在接收KeyError: 'GPSInfo'

有關如何忽略沒有數據或不同的照片的任何想法文件類型?

+2

你嘗試過'嘗試:''除了KeyError:'? https://docs.python.org/3/tutorial/errors.html –

+1

或者'if'GPSInfo'在exif_data:..'等等 – 9000

+0

謝謝你們,明白了! – Maverick

回答

0

一種可能的方法是編寫一個小的幫助程序函數,它首先檢查文件是否實際上是一個圖像文件,並且作爲第二步檢查該圖像是否包含EXIF數據。

def is_metadata_image(filename): 
    try: 
     image = Image.open(filename) 
     return 'exif' in image.info 
    except OSError: 
     return False 

我發現,PIL不會每次都能與使用_getexif()時確實包含EXIF信息.png文件。因此,我檢查圖像的info字典中的密鑰exif