Python实现智能批量重命名文件的完整指南
作者:小庄-Python办公
这篇文章将教你用Python批量重命名,按日期、加序号、规范化、提取关键词,四种策略一次掌握,代码简单,无需额外安装,还提供预览和防冲突保护,让你的文件管理从此井井有条
场景引入
下载文件夹里是不是有这些文件名?
新建文档 (3).docx
未命名 (1).xlsx
DSC_0847.JPG
截图 (2024-03-01 14-32-15).png
报告终稿_最终版_不改了_v2.pdf
这些文件名毫无意义,过几天就不知道是什么内容了。本节教你用 Python 批量重命名,让文件名变得清晰可读。
技术原理
批量重命名的核心:扫描文件 → 根据规则生成新文件名 → 重命名(os.rename)扫描文件 → 根据规则生成新文件名 → 重命名(os.rename)
常用命名规则
| 规则 | 适用场景 | 示例 |
|---|---|---|
| 按日期重命名 | 照片、截图 | 2024-03-01_会议纪要.docx |
| 加前缀/序号 | 批量编号 | 001_合同.pdf, 002_发票.pdf |
| 提取关键词 | 合同/报告类 | 华为-2024Q1合同.pdf |
| 统一格式 | 规范化 | 全小写、替换空格为下划线 |
环境准备
无需额外安装,使用 Python 内置模块。如需从 PDF/Word 中提取关键词,需安装:
pip install PyPDF2 python-docx
完整代码
import os
from pathlib import Path
from datetime import datetime
# ==================== 方案 1:按日期重命名 ====================
def rename_by_date(target_dir, prefix="", suffix="", date_format="%Y-%m-%d"):
"""
按文件修改日期重命名
参数:
target_dir: 目标目录
prefix: 文件名前缀
suffix: 文件名后缀
date_format: 日期格式
"""
target_path = Path(target_dir)
count = 0
for file_path in target_path.iterdir():
if file_path.is_file():
# 获取修改时间
mtime = datetime.fromtimestamp(file_path.stat().st_mtime)
date_str = mtime.strftime(date_format)
# 生成新文件名
new_name = f"{prefix}{date_str}{suffix}{file_path.suffix}"
new_path = target_path / new_name
# 避免重复命名
if new_path != file_path and not new_path.exists():
file_path.rename(new_path)
print(f"{file_path.name} → {new_name}")
count += 1
print(f"\n重命名完成: {count} 个文件")
# ==================== 方案 2:批量加序号前缀 ====================
def rename_with_sequential_numbers(target_dir, prefix="", start=1):
"""
按文件排序后加序号
示例: 001_合同.pdf, 002_发票.pdf, 003_报告.pdf
"""
target_path = Path(target_dir)
files = sorted([f for f in target_path.iterdir() if f.is_file()])
# 计算序号位数(10 个文件用 2 位,100 个用 3 位)
num_digits = len(str(len(files) + start))
for idx, file_path in enumerate(files, start):
num_str = str(idx).zfill(num_digits)
new_name = f"{prefix}{num_str}_{file_path.name}"
new_path = target_path / new_name
if not new_path.exists():
file_path.rename(new_path)
print(f"{file_path.name} → {new_name}")
print(f"\n序号重命名完成: {len(files)} 个文件")
# ==================== 方案 3:规范化文件名 ====================
def normalize_filenames(target_dir):
"""
规范化文件名:
- 空格替换为下划线
- 多个连续空格合并为一个
- 全小写
- 移除特殊字符
"""
import re
target_path = Path(target_dir)
count = 0
for file_path in target_path.iterdir():
if file_path.is_file():
old_name = file_path.name
stem = file_path.stem
suffix = file_path.suffix
# 规范化处理
new_stem = stem.lower() # 全小写
new_stem = re.sub(r'\s+', '_', new_stem) # 空格→下划线
new_stem = re.sub(r'[^\w\u4e00-\u9fff_-]', '', new_stem) # 移除特殊字符(保留中文)
new_stem = re.sub(r'_+', '_', new_stem) # 合并连续下划线
new_stem = new_stem.strip('_') # 去除首尾下划线
new_name = new_stem + suffix
if new_name != old_name:
new_path = target_path / new_name
if not new_path.exists():
file_path.rename(new_path)
print(f"{old_name} → {new_name}")
count += 1
else:
print(f"[跳过] {new_name} 已存在")
print(f"\n规范化完成: {count} 个文件")
# ==================== 方案 4:查找并替换文件名中的文本 ====================
def find_replace_in_filenames(target_dir, find_text, replace_text=""):
"""
批量查找替换文件名中的文本
参数:
target_dir: 目标目录
find_text: 要查找的文本
replace_text: 替换为(默认删除)
"""
target_path = Path(target_dir)
count = 0
for file_path in target_path.iterdir():
if file_path.is_file():
if find_text in file_path.name:
new_name = file_path.name.replace(find_text, replace_text)
new_path = target_path / new_name
if not new_path.exists():
file_path.rename(new_path)
print(f"{file_path.name} → {new_name}")
count += 1
print(f"\n查找替换完成: {count} 个文件")
# ==================== 使用示例 ====================
if __name__ == "__main__":
TARGET_DIR = r"D:\Downloads"
# 方案 1:按日期重命名照片
# rename_by_date(r"D:\照片", prefix="照片_", date_format="%Y%m%d")
# 效果: 照片_20240301.jpg
# 方案 2:批量加序号
# rename_with_sequential_numbers(r"D:\合同", prefix="合同_")
# 效果: 合同_001_原文件名.pdf
# 方案 3:规范化所有文件名
# normalize_filenames(TARGET_DIR)
# 方案 4:批量删除文件名中的 "(1)"
find_replace_in_filenames(TARGET_DIR, "(1)", "")
代码逐行解析
1. 获取文件修改时间
mtime = datetime.fromtimestamp(file_path.stat().st_mtime)
file_path.stat()获取文件元数据(大小、时间等).st_mtime是最后修改时间(Unix 时间戳)datetime.fromtimestamp()转为可读的日期对象
2. 序号位数自动计算
num_digits = len(str(len(files) + start)) num_str = str(idx).zfill(num_digits)
- 10 个文件 → 2 位 →
01~10 - 100 个文件 → 3 位 →
001~100 .zfill()左侧补零
3. 正则表达式规范化
re.sub(r'\s+', '_', new_stem) # 一个或多个空格 → 一个下划线 re.sub(r'[^\w\u4e00-\u9fff_-]', '', new_stem) # 保留字母、数字、中文、下划线
\w匹配字母、数字、下划线\u4e00-\u9fff是中文字符的 Unicode 范围^在[]内表示取反
进阶技巧
技巧 1:从 PDF 内容提取关键词作为文件名
import PyPDF2
def rename_pdf_by_content(pdf_path, max_words=5):
"""从 PDF 前几行提取关键词作为文件名"""
with open(pdf_path, 'rb') as f:
reader = PyPDF2.PdfReader(f)
# 读取第一页的前 500 个字符
text = reader.pages[0].extract_text()[:500]
# 提取前几个有意义的词
words = text.split()[:max_words]
keywords = '_'.join(words)
return f"Python重命名文件,Python重命名,Python文件整理.pdf"
技巧 2:从 Word 文档标题提取文件名
from docx import Document
def rename_docx_by_title(docx_path):
doc = Document(docx_path)
# 假设第一个段落是标题
title = doc.paragraphs[0].text[:50]
return f"{title}.docx"
技巧 3:生成重命名预览报告
def generate_rename_preview(target_dir):
"""生成 Excel 格式的改名预览"""
import pandas as pd
records = []
for f in Path(target_dir).iterdir():
if f.is_file():
records.append({
'原文件名': f.name,
'文件大小(字节)': f.stat().st_size,
'修改时间': datetime.fromtimestamp(f.stat().st_mtime),
'后缀': f.suffix
})
df = pd.DataFrame(records)
df.to_excel("重命名预览报告.xlsx", index=False)
print("预览报告已生成: 重命名预览报告.xlsx")
常见问题
Q1:重命名后文件找不到了?
文件名确实改了,只是你可能不记得新名字。建议在重命名前先做预览。
Q2:两个文件生成了相同的新文件名?
代码中通过 if not new_path.exists() 做了保护,冲突的文件不会被重命名。如需更智能的处理(如自动加序号),可在冲突时添加后缀。
Q3:可以撤销重命名吗?
Python 的 rename() 操作无法直接撤销。建议:
# 方法 1:重命名前先备份
import shutil
shutil.copytree(target_dir, target_dir + "_backup")
# 方法 2:生成改名日志
with open("rename_log.txt", "w") as f:
f.write(f"{old_name} → {new_name}\n")
总结
| 重命名规则 | 函数 | 效果示例 |
|---|---|---|
| 按日期 | rename_by_date() | 2024-03-01_报告.pdf |
| 加序号 | rename_with_sequential_numbers() | 001_合同.pdf |
| 规范化 | normalize_filenames() | huibao_zhonggao.pdf |
| 查找替换 | find_replace_in_filenames() | 删除 (1) 等无用后缀 |
本节掌握了 4 种常用的批量重命名策略,让文件名从混乱变为规范可读。
到此这篇关于Python实现智能批量重命名文件的完整指南的文章就介绍到这了,更多相关Python重命名文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
