如何在python子进程中使用exiftool?

r6l8ljro  于 2023-03-20  发布在  Python
关注(0)|答案(1)|浏览(295)

我想读取包含文件夹列表的文件,然后在每个文件夹中搜索图像,并应用exiftool命令检索CSV文件格式的元数据。

f = open("exifs.csv","w")
    f.write("id;name;E;N;Alt_gps;date;iso;speed;oberture\n")

    for line in file:
        print (line)
        if not line.startswith('#') :
            line2 = line.strip()
            for photo in os.listdir(line2):

                subprocess.call(shlex.split('exiftool -p $directory;$filename;$GPSLongitude#;$GPSLatitude#;$GPSAltitude#;$DateTimeOriginal;$iso;$ExposureTime;$Fnumber -f -c "%f" {x}'.format(x=photo)), stdout=f)

    f.close()

实际上,这只是列出了文件夹中包含的所有图像,而没有对exiftool应用子进程调用。

k5ifujac

k5ifujac1#

下面是在Python(3 - 11)中传递一个命令给ExifTool(以及更多当前的方法和库)的方法。
我假设您的文本文件看起来像下面的paths.txt

# Paths:
  C:\Path\To\dir1 
  C:\Path\To\dir2 
  C:\Path\To\dir3

下面我从文本文件中收集文件路径,并在命令通过subprocess.run()传递给ExifTool时,在命令末尾列出所有路径。

from pathlib import Path
import subprocess, shlex
# Get lines from text file
with open('paths.txt', 'r') as file:
    lines = file.readlines()
# Get a list of file paths from the dir paths
fp_list = [fp for l in lines if not l.startswith('#') for fp in Path(l.strip()).iterdir()]
# The pathlib equivalent to os.listdir() is iterdir()
args = shlex.split('exiftool -p $directory;$filename;$GPSLongitude#;$GPSLatitude#;$GPSAltitude#;$DateTimeOriginal;$iso;$ExposureTime;$Fnumber -f -c "%f"')
# Pass all of the file paths in one ExifTool command
proc = subprocess.run([args, *fp_list], capture_output=True)
# run() replaced call(), run() returns the CompletedProcess class
# Write the headers and ExifTool output to a csv
with open("output.csv", "wb") as output:
    output.write("id;name;E;N;Alt_gps;date;iso;speed;oberture\n".encode())
    # Setting capture_output=True captures output in stdout and stderr
    output.write(proc.stdout)

output.csv

id;name;E;N;Alt_gps;date;iso;speed;oberture
C:/Path/To/dir1;test1.jpg;-;-;-;2023:03:15 00:00:00;100;1/10;1
C:/Path/To/dir2;test2.jpg;-;-;-;2023:03:15 00:00:00;100;1/10;1
C:/Path/To/dir3;test3.jpg;-;-;-;2023:03:15 00:00:00;100;1/10;1

相关问题