文件批量重命名(办公)脚本
目录
演示效果
一、核心功能
二、使用方法
1. 准备文件
2. 执行脚本
三、注意事项
四、脚本源码:(Python)
大家可以自行免费下载博主的脚本文件👇
文件重命名(办公)脚本(免费下载)
演示效果
文件批量重命名脚本演示视频
这个脚本的核心功能是按姓名匹配文件并批量重命名,能自动读取姓名学号清单和预设命名格式,将杂乱的文件(如作业)统一规范命名,同时生成操作日志记录过程
一、核心功能
1.自动匹配文件:只要目标文件名中包含 “姓名学号清单” 里的姓名(如 “招笑猫”),就能自动关联对应的学号,无需完整匹配文件名
2.灵活套用格式:从命名格式文件中读取规则(如 “6 班 {学号}{姓名} 第一次大学物理 C 作业”),自动替换{姓名}和{学号}占位符,保留原文件扩展名(如.pdf、.docx)
3.重名冲突处理:若新文件名已存在,会自动在末尾加数字后缀(如 “xxx_1.pdf”“xxx_2.pdf”),避免文件覆盖
4.详细日志记录:生成含时间戳的日志文件,记录每个文件的处理结果(成功 / 失败 / 跳过),方便后续核对
二、使用方法
使用前需准备 3 个关键文件,且需将它们放在同一个文件夹中(与待重命名的文件也放在此文件夹),具体步骤如下:
1. 准备文件
•脚本文件:确保batch_rename.py已保存到目标文件夹
•姓名学号清单(name_id_list.txt):按 “姓名,学号” 格式填写(逗号可加空格),支持用//或#开头添加注释行,示例如下:
| # 这是注释行,会被跳过 招笑猫,24111111 蹦跶狗,24022222 # 行尾注释也有效 |
•命名格式文件(rename_format.txt):填写含{姓名}和{学号}占位符的命名规则,无需加扩展名,示例如下:
| # 格式示例,会自动保留原扩展名 6班{学号}{姓名}第一次大学物理C作业 |
2. 执行脚本
1.在脚本所在文件夹按下Shift+鼠标右键,打开Powershell窗口
2.输入命令python batch_rename.py并回车,启动脚本
3.脚本运行完成后,按任意键关闭窗口,查看重命名结果和自动生成的日志文件(如rename_log_20250101_123456.txt)
三、注意事项
1.文件位置要求:待重命名的文件、脚本文件、name_id_list.txt、rename_format.txt必须在同一文件夹,否则脚本会报错 “未找到文件”
2.排除文件不处理:脚本会自动跳过 4 类文件,无需手动移走:
◦脚本本身(batch_rename.py)
◦姓名学号清单(name_id_list.txt)
◦命名格式文件(rename_format.txt)
◦自动生成的日志文件(rename_log_xxxxxx.txt)
1.姓名匹配规则:仅支持 “文件名含姓名” 的匹配(如 “24012177 李昊航作业.pdf” 能匹配 “李昊航”),若文件名不含清单中的姓名(如 “作业 1.pdf”),会被标记为 “未匹配跳过”
2.权限与文件占用:
◦若提示 “重命名失败”,需先关闭正在打开的目标文件(如已用 PDF 阅读器打开的作业)
◦确保当前用户有文件夹的 “写入权限”(如避免放在 C 盘系统目录)
1.日志核对:运行后务必查看日志文件,确认成功 / 失败 / 跳过的文件,避免遗漏未处理的文件
四、脚本源码:(Python)
import os
from datetime import datetime# -------------------------- 基础配置(无需修改) --------------------------
# 文件名定义(需与实际文件一致)
ID_LIST_FILE = "name_id_list.txt" # 姓名学号清单
FORMAT_FILE = "rename_format.txt" # 命名格式文件
# 日志文件(自动生成,含时间戳)
LOG_FILE = f"rename_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"def write_log(content, is_print=True):"""写日志并可选在控制台打印"""with open(LOG_FILE, "a", encoding="utf-8") as f:f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {content}\n")if is_print:print(content)def load_name_id_map():"""加载姓名-学号映射(处理中文无压力)"""name_id_map = {}if not os.path.exists(ID_LIST_FILE):write_log(f"错误:未找到姓名学号清单文件「{ID_LIST_FILE}」", is_print=True)exit(1)with open(ID_LIST_FILE, "r", encoding="utf-8") as f:lines = f.readlines()for line_num, line in enumerate(lines, 1):line = line.strip()# 跳过注释行(// 或 # 开头)和空行if not line or line.startswith(("//", "#", "::")):continue# 按逗号分割姓名和学号(允许逗号前后有空格)parts = [p.strip() for p in line.split(",")]if len(parts) != 2:write_log(f"警告:第{line_num}行格式错误(需「姓名,学号」),已跳过:{line}")continuename, student_id = partsif name and student_id:name_id_map[name] = student_idwrite_log(f"已加载:姓名={name} → 学号={student_id}")if not name_id_map:write_log("错误:姓名学号清单中无有效数据,无法继续", is_print=True)exit(1)return name_id_mapdef load_rename_format():"""加载重命名格式(如:6班{学号}{姓名}大学物理C第一次作业)"""if not os.path.exists(FORMAT_FILE):write_log(f"错误:未找到命名格式文件「{FORMAT_FILE}」", is_print=True)exit(1)with open(FORMAT_FILE, "r", encoding="utf-8") as f:# 读取第一行有效内容(跳过空行和注释)for line in f.readlines():line = line.strip()if not line or line.startswith(("//", "#", "::")):continuewrite_log(f"已加载命名格式:{line}")return linewrite_log("错误:命名格式文件中无有效格式,无法继续", is_print=True)exit(1)def batch_rename(name_id_map, rename_format):"""批量重命名核心逻辑:只要文件名含姓名就匹配"""success_count = 0fail_count = 0skip_count = 0# 获取当前文件夹所有文件(排除脚本、清单、格式、日志文件)exclude_files = {os.path.basename(__file__), # 当前脚本ID_LIST_FILE,FORMAT_FILE,LOG_FILE}for file_name in os.listdir("."):# 跳过文件夹和需排除的文件if os.path.isdir(file_name) or file_name in exclude_files:continueold_file_path = os.path.join(".", file_name)matched = Falsetarget_name = ""target_id = ""# 遍历姓名清单,匹配文件名中的姓名(含部分匹配,如“李昊航”匹配“24012177李昊航作业.pdf”)for name, student_id in name_id_map.items():if name in file_name:target_name = nametarget_id = student_idmatched = Truebreakif not matched:write_log(f"跳过:{file_name}(未在文件名中找到清单中的姓名)")skip_count += 1continue# 生成新文件名:替换占位符 + 保留原扩展名file_ext = os.path.splitext(file_name)[1] # 原文件扩展名(如.pdf)new_file_name = rename_format.replace("{姓名}", target_name).replace("{学号}", target_id) + file_extnew_file_path = os.path.join(".", new_file_name)# 处理重名:若新文件名已存在,加后缀(如“xxx_1.pdf”)duplicate_count = 1while os.path.exists(new_file_path):new_file_name = f"{rename_format.replace('{姓名}', target_name).replace('{学号}', target_id)}_{duplicate_count}{file_ext}"new_file_path = os.path.join(".", new_file_name)duplicate_count += 1# 执行重命名try:os.rename(old_file_path, new_file_path)write_log(f"成功:{file_name} → {new_file_name}(姓名:{target_name},学号:{target_id})")success_count += 1except Exception as e:write_log(f"失败:{file_name}(原因:{str(e)},姓名:{target_name},学号:{target_id})")fail_count += 1# 输出最终统计write_log("=" * 50)write_log(f"处理完成!统计结果:")write_log(f"成功重命名:{success_count} 个文件")write_log(f"重命名失败:{fail_count} 个文件(建议关闭占用文件后重试)")write_log(f"未匹配跳过:{skip_count} 个文件")write_log(f"日志文件已保存至:{LOG_FILE}")write_log("=" * 50)if __name__ == "__main__":write_log("=" * 50, is_print=False)write_log("批量重命名工具启动", is_print=False)write_log("=" * 50, is_print=False)# 加载配置name_id_map = load_name_id_map()rename_format = load_rename_format()# 执行批量重命名batch_rename(name_id_map, rename_format)# 防止运行后窗口直接关闭(按任意键退出)input("按任意键退出...")
