本文目录导读:

是的,确实可以!很多照片管理工具和脚本都能根据拍摄日期自动重命名文件,我给你写一个 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查看效果 - 自定义格式:可以根据喜好调整日期格式
- 批量处理:可以处理成千上万张照片,但会逐一显示进度
这个脚本简单实用,能有效解决照片文件名混乱的问题,如果需要其他功能(如按日期分类到子文件夹),也可以进一步扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播