需求背景
许多图片压缩软件在压缩图片后,会丢失图片文件的真正创建时间、修改时间,也就会导致图片时间线被打乱。
因此需要从原始图片中读取创建时间、修改时间,并将其中较早的一个写入压缩后图片的修改时间。
- 注 1:实际观察中发现,有的图片修改时间比创建时间更早
- 注 2:写入文件的创建时间需要额外安装第三方库
pip install pywin32
,而时间线一般只需要修改时间即可,因此没有实现对创建时间的修改。
代码
# 从 source_dir 读取文件创建时间和修改时间
# 将两个时间中最早的一个写入 target_dir 各同名文件
# 用于恢复压缩图片的时间戳
import os
import shutil
import datetime
def get_file_times(file_path):
# 获取文件的创建时间和修改时间
created_time = datetime.datetime.fromtimestamp(os.path.getctime(file_path))
modified_time = datetime.datetime.fromtimestamp(
os.path.getmtime(file_path))
return created_time, modified_time
def change_file_time(file_path, new_modify_time):
# 将新的修改时间转换为时间戳
modify_timestamp = new_modify_time.timestamp()
# 使用 os.utime() 函数修改文件的修改时间
os.utime(file_path, times=(modify_timestamp, modify_timestamp))
def merge_file_times(source_dir, target_dir):
# 遍历源文件夹中的文件
for root, dirs, files in os.walk(source_dir):
for file in files:
# 构建源文件和目标文件的路径
source_file_path = os.path.join(root, file)
target_file_path = os.path.join(target_dir, file)
# 获取源文件的创建时间和修改时间
created_time, modified_time = get_file_times(source_file_path)
# 将创建时间和修改时间中较早的一个作为目标文件的修改时间
new_modify_time = min(created_time, modified_time)
# 如果目标文件不存在,则创建一个空文件
if not os.path.exists(target_file_path):
continue
# 修改目标文件的修改时间
change_file_time(target_file_path, new_modify_time)
# 指定源文件夹和目标文件夹的路径
source_dir = r'C:\Users\PC\Desktop\src'
target_dir = r'C:\Users\PC\Desktop\compress'
# 合并文件时间
merge_file_times(source_dir, target_dir)