根据图片文件名获取时间并更改时间戳

2025 / 2 / 4

背景

最近我在备份旧手机中的图片,但我发现从云盘下载的图片修改时间会变为文件被下载的时间,而不是真正的图片创建时间,这就导致导入相册后不同时间的照片都显示在同一天,看着很难受。看起来图片的名称里是包含正确时间的,于是我想,能否用Python写一个脚本自动根据图片文件名获取时间并更改时间戳呢?

过程

出现上述问题的均为屏幕截图,随便找两个文件,不难看出文件有两种命名规则:

(如果是相机照片命名方法不同,大部分是IMGxxxxx.jpg,但思路一样)

Screenshot_20240303_182910_com.bilibili.app.in.jpg

  • Screenshot:表明文件是截图。

  • 20240303:代表日期,格式是 YYYYMMDD ,即2024年3月3日。

  • 182910:代表时间,格式是 HHMMSS ,即18点29分10秒。

  • com.bilibili.app.in:应用包名。

  • .jpg:文件的扩展名,表示该文件是一个JPEG格式的图片。

Screenshot_20250322_200408.jpg

  • Screenshot:同样是截图。

  • 20250322:日期,格式是YYYYMMDD,即2025年3月22日。

  • 200408:时间,格式是HHMMSS,即20点04分08秒。

  • .jpg:文件的扩展名,表示该文件是一个JPEG格式的图片。

根据这些规律,可以写出如下代码:

import os import re from datetime import datetime # 函数:根据文件名中的日期修改文件的时间戳 def change_timestamp_from_filename(file_path): # 提取文件名 filename = os.path.basename(file_path) # 使用正则表达式提取时间字符串 match = re.search(r'Screenshot_(\d{8})_(\d{6})', filename) if match: # 提取日期和时间 date_str = match.group(1) time_str = match.group(2) # 将提取的日期和时间合并成一个完整的时间字符串 datetime_str = date_str + time_str # 将字符串转换为datetime对象 timestamp = datetime.strptime(datetime_str, '%Y%m%d%H%M%S') # 获取文件的修改时间 timestamp_epoch = timestamp.timestamp() # 修改文件的访问时间和修改时间 os.utime(file_path, (timestamp_epoch, timestamp_epoch)) print(f"文件 '{file_path}' 的时间戳已更新为 {timestamp}") else: print(f"文件 '{file_path}' 的文件名没有包含有效的日期时间信息。") # 示例:批量处理文件 def process_files(directory): # 获取目录中的所有文件 for filename in os.listdir(directory): file_path = os.path.join(directory, filename) if os.path.isfile(file_path): change_timestamp_from_filename(file_path) # 运行脚本,指定目标文件夹路径 directory = r'C:\114\514' # 替换为你的文件夹路径 process_files(directory)

新建一个Py文件,修改照片所在目录就能运行了,不出意外你能得到这样的输出:

问题解决了 :)

如果我能帮到你,记得点个赞↓