批量文件重命名工具
快速预览:
import os
folder = './documents'
for filename in os.listdir(folder):
if filename.endswith('.txt'):
new_name = 'backup_' + filename
os.rename(os.path.join(folder, filename),
os.path.join(folder, new_name))
应用场景与价值
在日常工作中,我们经常需要处理大量文件的重命名任务。例如: - 整理下载的文档,统一添加日期前缀以便排序 - 批量修改照片文件名,加入拍摄地点标识 - 为备份文件统一添加 "backup_" 前缀 - 批量修改文件扩展名以适配不同软件
手动重命名不仅耗时费力,还容易出错。使用 Python 编写的批量重命名工具,只需几行代码就能在几秒内完成数百个文件的重命名操作,显著提升工作效率。
基础知识
os 模块
os 模块是 Python 的标准库之一,提供了与操作系统交互的功能。在本案例中,我们主要使用以下三个函数:
- os.listdir(path): 返回指定目录下所有文件和文件夹的名称列表
- os.rename(src, dst): 将文件或文件夹从 src 路径重命名为 dst 路径
- os.path.join(path, *paths): 智能地拼接路径,自动处理不同操作系统的路径分隔符差异
字符串操作
Python 字符串提供了丰富的方法:
- endswith(suffix): 判断字符串是否以指定后缀结尾
- 字符串拼接: 使用 + 运算符或 f-string 格式化
代码详解
让我们逐步分析代码的执行逻辑:
import os
导入 os 模块,这是进行文件系统操作的基础。
folder = './documents'
定义目标文件夹路径。./ 表示当前工作目录下的 documents 文件夹。可以根据需求修改为绝对路径,如 /Users/username/documents。
for filename in os.listdir(folder):
遍历目标文件夹中的所有文件和子文件夹名称。注意 os.listdir() 返回的是文件名而非完整路径。
if filename.endswith('.txt'):
过滤条件:仅处理扩展名为 .txt 的文本文件。这防止了误操作其他类型的文件。
new_name = 'backup_' + filename
生成新文件名:在原文件名前添加 backup_ 前缀。例如 report.txt 会变成 backup_report.txt。
os.rename(os.path.join(folder, filename),
os.path.join(folder, new_name))
执行重命名操作。os.path.join() 用于构建完整的文件路径,确保路径拼接正确。
完整代码
基础版本
import os
def batch_rename(folder_path, prefix='', suffix='', extension_filter=None):
"""
批量重命名文件
参数:
folder_path: 目标文件夹路径
prefix: 要添加的前缀
suffix: 要添加的后缀(插入到扩展名之前)
extension_filter: 要处理的文件扩展名,如 '.txt'。None 表示处理所有文件
"""
if not os.path.exists(folder_path):
print(f"错误: 文件夹 '{folder_path}' 不存在")
return
renamed_count = 0
for filename in os.listdir(folder_path):
# 构建完整路径
old_path = os.path.join(folder_path, filename)
# 跳过文件夹
if os.path.isdir(old_path):
continue
# 如果指定了扩展名过滤,则检查
if extension_filter and not filename.endswith(extension_filter):
continue
# 分离文件名和扩展名
name, ext = os.path.splitext(filename)
# 构建新文件名
new_name = f"{prefix}{name}{suffix}{ext}"
new_path = os.path.join(folder_path, new_name)
# 检查新文件名是否已存在
if os.path.exists(new_path):
print(f"警告: '{new_name}' 已存在,跳过 '{filename}'")
continue
# 执行重命名
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_name}")
renamed_count += 1
print(f"\n完成! 共重命名 {renamed_count} 个文件")
# 使用示例
if __name__ == "__main__":
# 为所有 .txt 文件添加 'backup_' 前缀
batch_rename('./documents', prefix='backup_', extension_filter='.txt')
高级版本:添加日期前缀
import os
from datetime import datetime
def batch_rename_with_date(folder_path, date_format='%Y%m%d', extension_filter=None):
"""
批量重命名文件,添加日期前缀
参数:
folder_path: 目标文件夹路径
date_format: 日期格式,默认为 YYYYMMDD
extension_filter: 要处理的文件扩展名
"""
current_date = datetime.now().strftime(date_format)
prefix = f"{current_date}_"
for filename in os.listdir(folder_path):
old_path = os.path.join(folder_path, filename)
if os.path.isdir(old_path):
continue
if extension_filter and not filename.endswith(extension_filter):
continue
new_name = prefix + filename
new_path = os.path.join(folder_path, new_name)
if not os.path.exists(new_path):
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_name}")
# 使用示例
batch_rename_with_date('./documents', extension_filter='.txt')
# 结果示例: report.txt -> 20260109_report.txt
运行示例
准备测试环境
# 创建测试文件夹和文件
import os
os.makedirs('./documents', exist_ok=True)
for i in range(1, 6):
with open(f'./documents/file{i}.txt', 'w') as f:
f.write(f'This is test file {i}')
执行重命名
uv run main.py
预期输出
重命名: file1.txt -> backup_file1.txt
重命名: file2.txt -> backup_file2.txt
重命名: file3.txt -> backup_file3.txt
重命名: file4.txt -> backup_file4.txt
重命名: file5.txt -> backup_file5.txt
完成! 共重命名 5 个文件
扩展思路
1. 支持正则表达式替换
使用 re 模块实现更复杂的文件名模式匹配和替换:
import re
def regex_rename(folder_path, pattern, replacement):
"""使用正则表达式批量重命名"""
for filename in os.listdir(folder_path):
new_name = re.sub(pattern, replacement, filename)
if new_name != filename:
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
2. 添加撤销功能
在重命名前保存操作记录到 JSON 文件,支持一键还原:
import json
rename_log = []
for old, new in rename_operations:
os.rename(old, new)
rename_log.append({'old': old, 'new': new})
with open('rename_log.json', 'w') as f:
json.dump(rename_log, f)
3. 递归处理子文件夹
使用 os.walk() 遍历所有子文件夹:
for root, dirs, files in os.walk(folder_path):
for filename in files:
# 处理每个文件
pass
4. 图形界面版本
使用 tkinter 或 PyQt 创建可视化界面,让非技术用户也能轻松使用。
5. 安全性增强
- 添加预览模式,显示将要进行的重命名操作但不实际执行
- 支持文件名冲突时自动添加序号
- 添加日志记录功能,追踪所有操作历史
6. 批量修改文件扩展名
def change_extension(folder_path, old_ext, new_ext):
"""批量修改文件扩展名"""
for filename in os.listdir(folder_path):
if filename.endswith(old_ext):
new_name = filename[:-len(old_ext)] + new_ext
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
注意事项
- 备份重要文件: 在对重要文件进行批量重命名前,务必先备份
- 路径正确性: 确保文件夹路径正确,避免操作错误的目录
- 权限问题: 确保程序对目标文件夹有读写权限
- 文件名冲突: 处理好新文件名与已存在文件名冲突的情况
- 特殊字符: 注意不同操作系统对文件名特殊字符的限制
通过掌握这个批量文件重命名工具,你可以轻松应对各种文件整理场景,显著提升工作效率。