【问题标题】:How to extract jpg EXIF metadata from a folder in chronological order如何按时间顺序从文件夹中提取 jpg EXIF 元数据
【发布时间】:2021-12-15 09:33:13
【问题描述】:

我目前正在编写一个脚本来从 jpg 图像文件夹中提取 EXIF GPS 数据。我正在使用 os.scandir 从文件夹中提取条目,但据我了解,os.scandir 以任意方式打开文件。我需要按文件名按时间顺序打开图像。下面是我当前的代码,它按预期工作,但它没有以正确的顺序打开图像。我的图像文件夹中的文件按时间顺序命名,如下所示:“IMG_0097、IMG_0098”等。

#!/usr/bin/python

import os, exif, folium

def convert_lat(coordinates, ref):
    latCoords = coordinates[0] + coordinates[1] / 60 + coordinates[2] / 3600
    if ref == 'W' or ref == 'S':
        latCoords = -latCoords
    return latCoords

coordList=[]
map = folium.Map(location=[51.50197125069916, -0.14000860301423912], zoom_start = 16)

from exif import Image
with os.scandir('gps/') as entries:
    try:
        for entry in entries:   
            img_path = 'gps/'+entry.name
            with open (img_path, 'rb') as src:
                img = Image(src)            
                if img.has_exif:
                    latCoords = (convert_lat(img.gps_latitude, img.gps_latitude_ref))
                    longCoords = (convert_lat(img.gps_longitude, img.gps_longitude_ref))
                    coord = [latCoords, longCoords]
                    coordList.append(coord)
                    folium.Marker(coord, popup=str(coord)).add_to(map)
                    folium.PolyLine(coordList, color =" red", weight=2.5, opacity=1).add_to(map)
                    print(img_path)
                    print(coord)
                else:
                    print (src.name,'has no EXIF information')
    except:
        print(img_path)
        print("error occured")

map.save(outfile='/home/jamesdean/Desktop/Python scripts/map.html')
print ("Map generated successfully")

【问题讨论】:

    标签: python exif


    【解决方案1】:

    我会说放弃 os.scandir 并利用标准库必须提供的更现代的功能:

    from pathlib import Path
    from operator import attrgetter
    
    # assuming there is a folder named "gps" in the current working directory...
    for path in sorted(Path("gps").glob("*.jpg"), key=attrgetter("stem")):
        print(path) # do something with the current path
    

    from operator import attrgetterkey=attrgetter("stem") 有点多余,但我只是明确说明我想使用什么属性来确定排序顺序。在这种情况下,路径的“stem”属性仅将文件名作为字符串引用。例如,如果当前路径的文件名(包括扩展名)为"IMG_0097.jpg",则path.stem 将是"IMG_0097"。就像我说的,词干是一个字符串,所以你的路径将按字典顺序排序。您不需要对整数进行任何转换,因为您的文件名已经包含前导零,因此字典顺序应该可以正常工作。

    【讨论】:

      【解决方案2】:

      您可以使用内置的sorted 函数对列表进行排序,Paul 提出了一个有趣的观点,不带任何参数的简单排序也可以正常工作:

      a = ["IMG_0097.jpg", "IMG_0085.jpg", "IMG_0043.jpg", "IMG_0098.jpg", "IMG_0099.jpg", "IMG_0100.jpg"] 
      sorted_list = sorted(a)
      print(sorted_list)
      

      输出:

      ['IMG_0043.jpg', 'IMG_0085.jpg', 'IMG_0097.jpg', 'IMG_0098.jpg', 'IMG_0099.jpg', 'IMG_0100.jpg']
      

      你可以这样做:

      for entry in sorted(entries):
      

      【讨论】:

      • 感谢您的回复,有没有办法自动将文件名提取到列表 a 中?我试图这样做但是在执行 print(sorted_list) 时遇到错误“ValueError: invalid literal for int() with base 10: '0164.jpg'” 这是我使用的代码:from exif import Image with os.scandir('gps/') as entries: for entry in entries: img_path = 'gps/'+entry.name filename.append(img_path) sorted_list = sorted(filename, key=lambda x: int(x.split("_")[1])) print(sortedList)
      • 你可以这样做:a = [i.name for i in entries]
      • 对于错误我更新了代码现在试试吧。
      • 我已将列表更新为 `filename= [i.name for i in entries]` 但是我没有看到您的代码发生变化,我仍然遇到相同的错误。打印后。
      • 我添加了另一个拆分:sorted_list = sorted(a, key=lambda x: int(x.split("_")[1].split(".")[0]))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多