本文目录导读:

是的,确实可以!很多照片管理工具和脚本都能根据拍摄日期自动重命名文件,我给你写一个 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分
小贴士
- 先备份! 虽然脚本不会覆盖文件,但最好在重要操作前备份
- 先测试! 使用
dry_run=True查看效果 - 自定义格式:可以根据喜好调整日期格式
- 批量处理:可以处理成千上万张照片,但会逐一显示进度
这个脚本简单实用,能有效解决照片文件名混乱的问题,如果需要其他功能(如按日期分类到子文件夹),也可以进一步扩展。