如何按时间顺序从文件夹中提取 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 attrgetter
和 key=attrgetter("stem")
有点多余,但我只是明确说明我想使用什么属性来确定排序顺序。在这种情况下,路径的“stem”属性仅指作为字符串的文件名。例如,如果当前路径的文件名(包括扩展名)为 "IMG_0097.jpg"
,则 path.stem
将为 "IMG_0097"
。就像我说的,词干是一个字符串,所以你的路径将按字典顺序排序。您不需要对整数进行任何转换,因为您的文件名已经包含前导零,因此字典顺序应该可以正常工作。
我目前正在编写脚本以从 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 attrgetter
和 key=attrgetter("stem")
有点多余,但我只是明确说明我想使用什么属性来确定排序顺序。在这种情况下,路径的“stem”属性仅指作为字符串的文件名。例如,如果当前路径的文件名(包括扩展名)为 "IMG_0097.jpg"
,则 path.stem
将为 "IMG_0097"
。就像我说的,词干是一个字符串,所以你的路径将按字典顺序排序。您不需要对整数进行任何转换,因为您的文件名已经包含前导零,因此字典顺序应该可以正常工作。