ExifTool 结合 Python 实现媒体文件创建时间批量自动修改

本文详细介绍如何运用Python的自动化能力结合ExifTool的强大功能,实现媒体文件创建时间的批量自动修改。继之前对ExifTool的深入解析与实战介绍后,本文将聚焦于实际应用中的批量操作实践。

在日常处理大量媒体文件时,我们可能遇到需要批量调整文件创建时间的情况。结合Python的高效自动化能力和ExifTool这款全能的元数据处理工具,我们可以轻松实现这一目标。本文将引导您通过编写Python脚本,利用ExifTool的强大功能批量自动修改媒体文件的创建时间。

方法封装

首先,我们需要封装两个关键函数:get_media_creation_time()用于提取媒体文件的当前创建时间,set_media_creation_time()用于设置新的创建时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import subprocess
import re, os

def get_media_creation_time(file_path):
# 使用 exiftool 提取视频的 MediaCreateDate
command = f'exiftool -MediaCreateDate "{file_path}"'
try:
output = subprocess.check_output(command, shell=True).decode('utf-8')
match = re.search(r':\s*([\d\- :\.TZ]+)', output)
if match:
return match.group(1)
else:
return None
except subprocess.CalledProcessError as e:
print(f"Error while running exiftool: {e}")
return None

def set_media_creation_time(file_path, new_time):
# ExifTool 可以用来修改视频元数据
utc_command = f'exiftool -overwrite_original_in_place "-MediaCreateDate={new_time}" "{file_path}"'

try:
subprocess.run(utc_command, shell=True, check=True)
print(f"Media creation time successfully set to {new_time}.")
except subprocess.CalledProcessError as e:
print(f"Error while setting media creation time with exiftool: {e}")

这两个函数利用subprocess模块调用ExifTool命令行工具,分别获取和设置媒体文件的MediaCreateDate属性。错误处理机制确保了在执行过程中遇到问题时能够及时反馈。

脚本实现

接下来,我们将编写主程序main(),遍历指定目录下的媒体文件,并根据文件名中包含的日期信息(如果存在)来更新其创建时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def main():
path = '/nas/videos/' # 指定媒体文件所在目录
files = os.listdir(path)

for file in files:
file_path = os.path.join(path, file)
if os.path.isfile(file_path):
media_creation_time = get_media_creation_time(file_path)

# 检查是否为默认创建时间('0000:00:00 00:00:00'),若为默认值则尝试从文件名中提取日期
if media_creation_time == '0000:00:00 00:00:00':
date_pattern = r'^(\d{4}-\d{2}-\d{2})'
match = re.match(date_pattern, file)

if match:
extracted_date = match.group(1)
extracted_date = extracted_date.replace('-', ':') + ' 00:00:00'

print(f"{file:<40} {media_creation_time} -> {extracted_date}")
set_media_creation_time(file_path, extracted_date)

if __name__ == '__main__':
main()

主程序main()按照以下步骤执行:

  1. 定义路径:设定要处理的媒体文件所在目录。
  2. 获取文件列表:使用os.listdir()获取该目录下所有文件及子目录的名称。
  3. 遍历文件:对每个文件进行判断,仅处理实际的文件(非目录)。
  4. 检查并提取创建时间:检查当前文件的创建时间是否为默认值(’0000:00:00 00:00:00’)。如果是,则尝试从文件名中提取日期信息。
  5. 格式化日期:将提取到的日期字符串(如YYYY-MM-DD)转换为ExifTool所需的格式(如YYYY:MM:DD 00:00:00)。
  6. 设置创建时间:调用set_media_creation_time()函数,使用提取到的日期信息更新文件的创建时间,并输出操作结果。

通过运行此脚本,您将能便捷地批量修改指定目录下媒体文件的创建时间,极大地提高了工作效率。同时,脚本中灵活的日期提取逻辑使得其适用于具有特定命名规则的文件集,增强了实用性。