如何按时间顺序从文件夹中提取 jpg EXIF 元数据

How to extract jpg EXIF metadata from a folder in chronological order

我目前正在编写脚本以从 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")

您可以使用内置的 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):

我会说放弃 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"。就像我说的,词干是一个字符串,所以你的路径将按字典顺序排序。您不需要对整数进行任何转换,因为您的文件名已经包含前导零,因此字典顺序应该可以正常工作。