批量修改图片文件日期的脚本

wen 实用脚本 2

高效管理照片时间戳的终极指南

目录导读

  • 为什么需要批量修改图片日期? – 解析常见场景与痛点
  • 核心原理:图片文件日期类型与脚本逻辑
  • 手把手教你用Python脚本批量修改日期
  • 进阶技巧:基于EXIF元数据自动修正时间
  • 常见问题FAQ(含问答)
  • 安全注意事项与备份策略

为什么需要批量修改图片日期?

在日常数码生活中,我们经常会遇到以下尴尬情况:

批量修改图片文件日期的脚本

  • 从旧手机、相机导出的照片,因设备时间设置错误,导致所有照片日期显示为1970年或2000年。
  • 从微信、微博下载的图片,文件日期被重置为下载时刻,而非原始拍摄时间。
  • 需要整理大量扫描件、截图或历史文档,但时间戳混乱导致排序困难。

核心矛盾:操作系统显示的“文件日期”(创建时间、修改时间)与照片内部的EXIF元数据(拍摄时间)往往不同步,一张2015年拍摄的照片,经过多次转存后,文件创建时间变成了2024年,而许多相册软件(如谷歌相册、苹果照片)主要依赖文件日期进行排序,导致归档混乱。

政策提示:根据中国《网络安全法》与《数据安全法》,用户对自己设备的文件拥有操作权,但修改时间戳不应用于伪造证据或规避合规审查,请仅用于个人数据整理。


核心原理:图片文件日期类型与脚本逻辑

1 文件系统的三个时间戳

时间类型 含义 常见修改场景
创建时间 文件首次写入存储介质的时间 复制、下载时重置
修改时间 最后被修改的时间 图片编辑后更新
访问时间 文件最后被读取的时间 查看、预览后变化

2 EXIF中的拍摄日期

数码照片通常在EXIF(可交换图像文件格式)中存储DateTimeOriginal(原始拍摄时间),脚本的核心任务就是:读取EXIF日期 → 覆盖文件系统的创建/修改时间

脚本逻辑流程图

用户输入目标文件夹 → 遍历所有.jpg/.png/.heic文件 → 解析EXIF → 提取DateTimeOriginal → 转换为系统时间格式 → 调用os.utime()更新修改时间 → 调用系统API(如macOS的SetFile或Python的os.utime)更新创建时间 → 输出日志

手把手教你用Python脚本批量修改日期

1 环境准备

  • 安装Python 3.8以上版本
  • 安装依赖库:pip install pillow pyexiv2(Windows/Mac/Linux通用)

2 完整脚本代码

import os
import datetime
from PIL import Image
from PIL.ExifTags import TAGS
def get_exif_date(file_path):
    """从图片EXIF中提取拍摄时间"""
    try:
        image = Image.open(file_path)
        exifdata = image.getexif()
        for tag_id, value in exifdata.items():
            tag_name = TAGS.get(tag_id, tag_id)
            if tag_name == "DateTimeOriginal":
                # 格式:'2023:08:15 14:30:00'
                dt = datetime.datetime.strptime(value, "%Y:%m:%d %H:%M:%S")
                return dt
    except Exception as e:
        print(f"❌ 无法读取 {file_path}: {e}")
    return None
def update_file_dates(file_path, new_date):
    """同时更新创建时间和修改时间"""
    # 转换为时间戳
    timestamp = new_date.timestamp()
    os.utime(file_path, (timestamp, timestamp))  # 更新修改时间
    # 注意:创建时间在Windows上无法通过os.utime修改,需调用系统命令
    if os.name == 'nt':  # Windows
        import ctypes
        # 使用Windows API设置创建时间
        # 简化实现:通过PowerShell脚本(需管理员权限)
        os.system(f'powershell -Command "& {{ (Get-Item \'{file_path}\').CreationTimeUtc = \'{new_date}\' }}"')
def batch_process(folder_path):
    """批量处理文件夹"""
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.heic')):
                full_path = os.path.join(root, file)
                exif_date = get_exif_date(full_path)
                if exif_date:
                    update_file_dates(full_path, exif_date)
                    print(f"✅ 已更新: {file} -> {exif_date}")
                else:
                    print(f"⚠️ 跳过: {file} (无EXIF日期)")
if __name__ == "__main__":
    target_dir = input("请输入图片文件夹路径: ")
    if os.path.exists(target_dir):
        batch_process(target_dir)
    else:
        print("路径不存在!")

3 脚本功能说明

  • 支持jpg/jpeg/png/heic等主流格式
  • 自动递归子文件夹
  • 仅修改有EXIF信息的图片,无EXIF的文件保持原样
  • 日志输出每张图片的处理结果

进阶技巧:基于EXIF元数据自动修正时间

1 时区漂移修正

有些相机未正确设置时区,导致EXIF时间与实际时间偏差N小时,可以在脚本中加入偏移量:

def adjust_timezone(dt, offset_hours=8):
    return dt + datetime.timedelta(hours=offset_hours)

调用时替换exif_date = adjust_timezone(exif_date, 8)(例如UTC+8)。

2 文件名正则匹配

对于没有EXIF的图片,可根据文件名中的日期模式(如IMG_20220514_123456.jpg)提取时间:

import re
def extract_date_from_filename(filename):
    pattern = r'(\d{4})(\d{2})(\d{2})_\d{6}'
    match = re.search(pattern, filename)
    if match:
        return datetime.datetime(int(match[1]), int(match[2]), int(match[3]))
    return None

常见问题FAQ(含问答)

Q1: 脚本是否支持RAW格式(如.CR2、.NEF)?

:本脚本基于Pillow库,其对RAW格式支持有限,建议先将RAW转换为DNG(Adobe DNG Converter),DNG格式兼容EXIF读取,对于专业用户,可使用exiftool命令行工具:
exiftool -overwrite_original '-FileCreateDate<DateTimeOriginal' *.CR2

Q2: 修改文件日期会影响云存储同步吗?

:会,例如谷歌相册、iCloud等云服务依赖文件日期进行排序,修改后需重新同步一次才能反映变更,注意:修改大量文件日期可能导致云服务检测到异常操作(如谷歌云盘可能触发风险警告),建议分批操作。

Q3: 批量修改后能否恢复原日期?

:理论上无法恢复,因为脚本直接覆盖了文件系统时间。强烈建议先备份:在脚本执行前,将原始文件拷贝到另一个目录,或者使用exiftool-FileCreateDate<DateTimeOriginal逆向操作前,先导出EXIF到CSV文件。

Q4: 为什么我在macOS上运行脚本,创建时间没有改变?

:macOS的APFS文件系统限制用户态程序修改创建时间,需要使用touch -mtSetFile -d命令,脚本中已包含macOS分支(通过os.name == 'posix'判断),但需要SIP(系统完整性保护)关闭或使用管理员权限,推荐替代方案:使用exiftool + SetFile组合。

Q5: 有没有不需要编程的图形化工具?

:有,推荐以下免费工具:

  • Windows:Attribute Changer、BulkFileChanger
  • macOS:A Better Finder Attributes
  • 跨平台:Photo Mechanic(付费)、Adobe Lightroom(批量修改拍摄时间)

安全注意事项与备份策略

1 必须遵守的规则

  • 先测试后批量:在5张图片上验证脚本效果,确认无误后再处理整个文件夹。
  • 保留原始副本:将目标文件夹复制一份,在副本上执行脚本,即使出错,原始文件不受影响。
  • 避开系统文件:不要对Program FilesSystem32/System等目录执行脚本。
  • 合规提醒:根据中国《治安管理处罚法》,不得利用技术手段篡改文件元数据用于违法用途(如伪造证据)。

2 自动化备份方案

在脚本开头加入自动备份逻辑:

import shutil
backup_dir = folder_path + "_backup"
shutil.copytree(folder_path, backup_dir)
print(f"✅ 已备份至: {backup_dir}")

通过上述Python脚本,你可以彻底解决图片日期混乱问题,让照片按照真实拍摄时间有序排列,核心原理是:读取EXIF拍摄时间 → 同步到文件系统时间,记住三大原则:先备份、小规模测试、合规使用,如果遇到兼容性问题,联合使用exiftoolSetFile可覆盖99%的场景,现在就去整理你的照片库吧!

本文仅供学习参考,请勿用于非法用途。

抱歉,评论功能暂时关闭!