你的照片文件名太乱了?这个脚本能按日期自动重命名吗?

wen 实用脚本 48

本文目录导读:

你的照片文件名太乱了?这个脚本能按日期自动重命名吗?

  1. Python 脚本:按日期自动重命名照片
  2. 如何使用
  3. 常见问题
  4. 小贴士

是的,确实可以!很多照片管理工具和脚本都能根据拍摄日期自动重命名文件,我给你写一个 Python 脚本,它可以根据照片的 EXIF 元数据中的拍摄日期(或文件的修改日期)来批量重命名,让文件名变得整齐有序。

Python 脚本:按日期自动重命名照片

import os
import sys
from datetime import datetime
from PIL import Image
from PIL.ExifTags import TAGS
def get_date_from_exif(filepath):
    """从EXIF数据中提取拍摄日期"""
    try:
        image = Image.open(filepath)
        exif_data = image._getexif()
        if exif_data:
            for tag_id, value in exif_data.items():
                tag = TAGS.get(tag_id, tag_id)
                if tag == "DateTimeOriginal":
                    return datetime.strptime(value, "%Y:%m:%d %H:%M:%S")
    except Exception as e:
        pass
    return None
def get_date_from_file_modify(filepath):
    """从文件修改时间获取日期"""
    try:
        timestamp = os.path.getmtime(filepath)
        return datetime.fromtimestamp(timestamp)
    except:
        return None
def rename_photos_by_date(folder_path, format_str="%Y%m%d_%H%M%S", use_exif=True, dry_run=False):
    """
    按日期自动重命名照片
    参数:
    - folder_path: 照片所在文件夹路径
    - format_str: 日期格式,默认 "YYYYMMDD_HHMMSS"
    - use_exif: 是否优先使用EXIF拍摄日期(否则使用文件修改日期)
    - dry_run: 测试模式(只打印不改动)
    """
    # 支持的图片扩展名
    image_extensions = {'.jpg', '.jpeg', '.png', '.tiff', '.tif', '.bmp', '.webp', '.heic', '.heif'}
    # 检查文件夹是否存在
    if not os.path.isdir(folder_path):
        print(f"错误:文件夹 '{folder_path}' 不存在")
        return
    # 获取所有图片文件
    files = [f for f in os.listdir(folder_path) 
             if os.path.isfile(os.path.join(folder_path, f)) 
             and os.path.splitext(f)[1].lower() in image_extensions]
    if not files:
        print("未找到支持的图片文件")
        return
    print(f"找到 {len(files)} 个图片文件")
    print("开始处理...")
    # 用于跟踪已使用的文件名(避免重名覆盖)
    used_names = set()
    for i, filename in enumerate(files, 1):
        filepath = os.path.join(folder_path, filename)
        extension = os.path.splitext(filename)[1].lower()
        # 获取日期
        date_obj = None
        if use_exif:
            date_obj = get_date_from_exif(filepath)
        if not date_obj:
            date_obj = get_date_from_file_modify(filepath)
        if not date_obj:
            print(f"  [{i}/{len(files)}] ⚠️ 无法获取日期: {filename} - 跳过")
            continue
        # 生成新文件名
        base_name = date_obj.strftime(format_str)
        new_filename = f"{base_name}{extension}"
        # 处理重名情况
        counter = 1
        while new_filename in used_names or os.path.exists(os.path.join(folder_path, new_filename)):
            if new_filename == filename:  # 如果名字没变,跳过
                break
            new_filename = f"{base_name}_{counter:02d}{extension}"
            counter += 1
        if new_filename == filename:
            print(f"  [{i}/{len(files)}] ✅ 无需修改: {filename}")
            continue
        old_path = os.path.join(folder_path, filename)
        new_path = os.path.join(folder_path, new_filename)
        if dry_run:
            print(f"  [{i}/{len(files)}] 🔍 (测试) {filename} -> {new_filename}")
        else:
            try:
                os.rename(old_path, new_path)
                used_names.add(new_filename)
                print(f"  [{i}/{len(files)}] ✅ {filename} -> {new_filename}")
            except Exception as e:
                print(f"  [{i}/{len(files)}] ❌ 重命名失败: {filename} - {e}")
    print("处理完成!")
# ========== 使用示例 ==========
if __name__ == "__main__":
    # 配置参数(请修改为你的实际文件夹路径)
    PHOTO_FOLDER = r"C:\Users\YourName\Pictures\待整理"  # ← 修改这里!
    # 日期格式说明:
    # %Y = 四位数年份  %m = 两位数月份  %d = 两位数日期
    # %H = 小时(24h)  %M = 分钟  %S = 秒
    # 2025-04-05_14-30-00
    # 1. 先测试运行(不会实际修改文件)
    print("\n=== 测试模式(不会真正修改文件)===")
    rename_photos_by_date(
        folder_path=PHOTO_FOLDER,
        format_str="%Y%m%d_%H%M%S",  # 输出: 20250405_143000
        use_exif=True,  # 优先使用EXIF拍摄日期
        dry_run=True   # 测试模式
    )
    # 按任意键确认是否执行
    # input("\n按 Enter 键执行实际重命名,或 Ctrl+C 取消...")
    # 2. 实际执行(取消注释下面代码)
    # print("\n=== 执行重命名 ===")
    # rename_photos_by_date(
    #     folder_path=PHOTO_FOLDER,
    #     format_str="%Y%m%d_%H%M%S",
    #     use_exif=True,
    #     dry_run=False
    # )

如何使用

安装依赖

pip install pillow

修改配置

在脚本中找到 PHOTO_FOLDER,改成你的照片文件夹路径:

PHOTO_FOLDER = r"D:\相机照片\2025年04月"

先测试模式运行

脚本默认是 dry_run=True,只会打印将要执行的操作,不会实际修改文件

确认无误后执行

取消注释实际执行的部分,将 dry_run 改为 False

常见问题

Q:照片没有EXIF数据怎么办?

  • 脚本会回退到使用文件的最后修改日期
  • 如果连修改日期也没有(极罕见),会跳过该文件

Q:不同日期但同秒钟的照片会覆盖吗?

  • 不会!如果遇到重名,会自动添加 _01, _02 等后缀

Q:能处理手机照片吗?

  • 可以,只要照片包含 EXIF 数据(大多数手机都生成)
  • 但部分 HEIC/HEIF 格式可能需要额外库支持

Q:想调整日期格式?

  • 修改 format_str 参数,
    • "%Y-%m-%d_%H.%M.%S"2025-04-05_14.30.00
    • "%Y%m%d"20250405
    • "%Y年%m月%d日_%H时%M分"2025年04月05日_14时30分

小贴士

  1. 先备份! 虽然脚本不会覆盖文件,但最好在重要操作前备份
  2. 先测试! 使用 dry_run=True 查看效果
  3. 自定义格式:可以根据喜好调整日期格式
  4. 批量处理:可以处理成千上万张照片,但会逐一显示进度

这个脚本简单实用,能有效解决照片文件名混乱的问题,如果需要其他功能(如按日期分类到子文件夹),也可以进一步扩展。

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