
本文介绍如何使用python将文件名中开头的四位年份(如“2023_”)提取出来,并追加到主文件名末尾、紧邻扩展名之前,实现如“2023_familydrama.pdf”→“familydrama_2023.pdf”的批量重命名。
本文介绍如何使用python将文件名中开头的四位年份(如“2023_”)提取出来,并追加到主文件名末尾、紧邻扩展名之前,实现如“2023_familydrama.pdf”→“familydrama_2023.pdf”的批量重命名。
在处理大量按年份前缀命名的文档(如归档资料、照片、报告)时,常需统一调整命名规范。上述需求本质是:识别文件名中固定位置的四位年份(通常位于开头5个字符内),将其与剩余部分调换顺序,并保留原始扩展名。注意,示例中年份后紧跟下划线 _ 或连字符 -,但关键规律是:年份恒为前4位数字,且分隔符仅占1位(第5位),因此可安全采用切片方式提取。
以下为简洁可靠的实现方案:
import os
# 示例:验证逻辑(可先运行此段测试)
filenames = [
"2023_FamilyDrama.pdf",
"2024_FamilyDrama.pdf",
"2022-beachpics.pdf",
"2020 Hello_world bring fame.pdf",
"2019-this-is-my_doc.pdf"
]
for n in filenames:
name, ext = os.path.splitext(n) # 更健壮:正确分离扩展名(支持多点名如 "file.tar.gz")
if len(name) >= 4 and name[:4].isdigit(): # 确保前4位是数字,避免误处理
year = name[:4]
rest = name[5:] # 跳过分隔符(第5位),取后续全部内容
new_name = f"{rest}_{year}{ext}"
print(f"'{n}' → '{new_name}'")输出:
'2023_FamilyDrama.pdf' → 'FamilyDrama_2023.pdf' '2024_FamilyDrama.pdf' → 'FamilyDrama_2024.pdf' '2022-beachpics.pdf' → 'beachpics_2022.pdf' '2020 Hello_world bring fame.pdf' → 'Hello_world bring fame_2020.pdf' '2019-this-is-my_doc.pdf' → 'this-is-my_doc_2019.pdf'
✅ 实际批量重命名代码(含路径安全处理):
立即学习“Python免费学习笔记(深入)”;
import os
PATH = "/your/target/directory" # 替换为实际路径
for root, dirs, files in os.walk(PATH):
for f in files:
filepath = os.path.join(root, f)
name, ext = os.path.splitext(f)
# 安全校验:确保文件名至少5字符,且前4位为数字
if len(name) >= 5 and name[:4].isdigit():
try:
# 提取年份(前4位)和主体(第5位起)
year = name[:4]
body = name[5:]
new_filename = f"{body}_{year}{ext}"
new_filepath = os.path.join(root, new_filename)
# 关键:检查目标文件是否已存在,避免覆盖
if not os.path.exists(new_filepath):
os.rename(filepath, new_filepath)
print(f"✓ Renamed: {f} → {new_filename}")
else:
print(f"⚠ Skip (exists): {f} → {new_filename}")
except OSError as e:
print(f"✗ Failed to rename {f}: {e}")
else:
print(f"ℹ Skipped (no valid year prefix): {f}")? 重要注意事项:
- 使用
os.path.splitext()替代str.split('.'),可正确处理带多个点的扩展名(如.tar.gz); - 始终用
os.path.join()构建路径,确保跨平台兼容性; - 务必提前备份原始文件,重命名不可逆;
- 添加
os.path.exists()检查可防止同名冲突; - 若年份分隔符不统一(如存在空格、冒号等),建议改用正则表达式
re.match(r'^(\d{4})[^a-zA-Z0-9]*(.+)$', name)提升鲁棒性。
该方法简洁、高效、易于理解,适用于绝大多数基于年份前缀的文件整理场景。


















