几百个文件要按Excel名单重命名?Python 30行代码一键搞定——HR/财务/行政的批量改名终极方案
- 2026-09-24 05:56:19

上周一个做HR的朋友给我发消息,语气里全是崩溃:“我刚收了200多份简历,文件名全是乱的——‘张三简历.pdf’‘我的简历_0823.pdf’‘新建PDF.pdf’,还有人直接交了个‘文档1.pdf’。领导要求今天下班前全部改成‘工号-姓名-岗位’的格式,我改了50个手已经酸了,眼睛也花了,再改下去非得把张三和李四搞混不可。”
我太懂这种感觉了。不只是HR,财务同事每个月报销季要按日期重命名发票扫描件,行政的同事要按部门归档合同,老师要按学号重命名作业——全是同一个问题:手上有一份Excel名单,对应着一堆文件,要一个一个对照着重命名。
手动改吧,几百个文件至少耗一下午,改错一个还可能造成大麻烦;不改吧,文件名乱成一锅粥,找文件全靠缘分。
今天就给你一个终极方案:写一个30行出头的Python脚本,读取Excel里的映射关系,自动把文件全部重命名好,还自带非法字符清洗、重名冲突处理和改名失败回滚。零基础也能跟着做,代码复制过去就能用。
先花5分钟做好准备工作
在跑代码之前,咱们先把环境和材料准备好,就三步。
第一步:安装Python。 去 python.org 下载最新版本,安装的时候一定要勾选“Add Python to PATH”这个选项,不然后面命令行会找不到Python。装完之后打开命令行(Windows按Win+R输入cmd,Mac打开终端),输入 python --version,能看到版本号就说明装好了。
第二步:安装两个必要的库。 在命令行里输入:
pip install pandas openpyxlpandas用来读取Excel,openpyxl是pandas读取xlsx文件的引擎。等它跑完就装好了。
第三步:准备你的Excel映射表。 这个表的结构很简单,两列就行:
A列是旧文件名,必须包含扩展名,比如“张三简历.pdf” B列是新文件名,比如“001-张三-前端工程师.pdf” 第一行是表头,写“旧文件名”和“新文件名”就行
把这个Excel文件和你要改名的那些文件放在同一个文件夹里。比如你在D盘建个文件夹叫“简历重命名”,把Excel和200份PDF都丢进去。
材料齐了,接下来上代码。
30行代码,逐行给你讲明白
先把完整代码贴出来,你可以直接复制到一个文本文件里,保存为 rename_files.py(注意后缀名是.py不是.txt),放在刚才那个文件夹里。
import osimport pandas as pdexcel_path = "映射表.xlsx"folder_path = "."df = pd.read_excel(excel_path)success = []log = []for _, row in df.iterrows(): old_name = str(row["旧文件名"]).strip() new_name = str(row["新文件名"]).strip()for char inr'\/:*?"<>|': new_name = new_name.replace(char, "_") old_path = os.path.join(folder_path, old_name) new_path = os.path.join(folder_path, new_name)ifnot os.path.exists(old_path): log.append(f"[跳过] 未找到文件:{old_name}")continue base, ext = os.path.splitext(new_path) counter = 1while os.path.exists(new_path): new_path = f"{base}_{counter}{ext}" counter += 1try: os.rename(old_path, new_path) success.append((new_path, old_path)) log.append(f"[成功] {old_name} → {os.path.basename(new_path)}")except Exception as e: log.append(f"[失败] {old_name}:{str(e)}")withopen("重命名日志.txt", "w", encoding="utf-8") as f: f.write("\n".join(log))print(f"完成!成功{len(success)}个,详见重命名日志.txt")别被这堆代码吓到,我一行一行给你讲,看完你就知道每步在干什么。
import os 和 import pandas as pd:导入两个工具库。os是Python自带的文件操作模块,pandas是刚才装的数据处理库,用来读Excel。
excel_path = "映射表.xlsx":这里填你的Excel文件名。如果你的文件叫“简历名单.xlsx”,就改成对应的名字。
folder_path = ".":点号表示当前文件夹,也就是脚本所在的文件夹。因为我们把脚本和文件放在一起了,所以不用改。
df = pd.read_excel(excel_path):读取Excel文件,存到一个叫df的变量里。你可以把它理解成一个表格,后面就是逐行遍历这个表格。
success = [] 和 log = []:初始化两个空列表。success记录改名成功的文件(用于回滚),log记录所有操作日志。
for _, row in df.iterrows(): 开始遍历Excel的每一行。每次循环,row就是一行数据,包含“旧文件名”和“新文件名”两个字段。
old_name = str(row["旧文件名"]).strip() 和 new_name = str(row["新文件名"]).strip():分别取出旧文件名和新文件名,strip()去掉首尾可能存在的空格——这个很重要,Excel里经常会有看不见的空格导致匹配失败。
接下来三行是非法字符清洗:
for char inr'\/:*?"<>|': new_name = new_name.replace(char, "_")Windows系统不允许文件名中出现 \ / : * ? " < > | 这9个字符,如果你的新文件名里有这些字符(比如岗位名称里带斜杠“前端/后端”),重命名会直接报错。这段代码把这些字符全部替换成下划线,确保文件名合法。
old_path = os.path.join(folder_path, old_name) 和 new_path = os.path.join(folder_path, new_name):把文件夹路径和文件名拼接成完整路径。用os.path.join而不是手动拼斜杠,是因为Windows和Mac的路径分隔符不一样,这个函数会自动处理。
ifnot os.path.exists(old_path): log.append(f"[跳过] 未找到文件:{old_name}")continue先检查旧文件是否存在。如果Excel里写了“张三简历.pdf”但文件夹里没有这个文件,就记一条日志跳过,不会让整个脚本崩掉。continue的意思是跳过本次循环,继续处理下一行。
base, ext = os.path.splitext(new_path)counter = 1while os.path.exists(new_path): new_path = f"{base}_{counter}{ext}" counter += 1这是重名冲突处理。如果新文件名和已有的文件重名了(比如两个不同的旧文件都映射到了同一个新名字),自动在后面加序号:第一次加_1,第二次加_2,以此类推,绝不会覆盖已有文件。
try: os.rename(old_path, new_path) success.append((new_path, old_path)) log.append(f"[成功] {old_name} → {os.path.basename(new_path)}")except Exception as e: log.append(f"[失败] {old_name}:{str(e)}")核心重命名操作。os.rename就是执行改名的函数。成功了就把新旧路径都记到success列表里(后面回滚要用),同时写一条成功日志。如果出了异常(比如文件被其他程序占用),不会崩溃,而是记一条失败日志,继续处理下一个文件。
最后三行:把所有日志写入“重命名日志.txt”文件,用utf-8编码保证中文不乱码。然后在命令行打印成功数量。
整个脚本不到35行,逻辑非常清晰:读Excel → 逐行处理 → 清洗文件名 → 检查文件 → 处理重名 → 执行改名 → 记录日志。
怎么运行?手把手演示一遍
代码写好了,保存为 rename_files.py 放在你的文件文件夹里。然后跟着下面的步骤操作:
第一步,打开命令行。Windows在文件夹地址栏输入cmd然后回车,会直接在当前路径打开命令行;Mac右键文件夹选“在终端中打开”。
第二步,输入 python rename_files.py,回车。
你会看到屏幕上逐行输出处理结果,最后显示“完成!成功XXX个”。打开文件夹,你会发现所有文件已经整整齐齐地改成了新名字,同时多了一个“重命名日志.txt”,里面记录了每一个文件的改名情况。
整个过程,200个文件大概3秒钟跑完。
改错了怎么办?日志和回滚给你兜底
批量操作最怕的就是改错。这个脚本在设计上做了两层保护。
第一层是日志文件。 每次运行都会生成“重命名日志.txt”,里面清清楚楚记录了哪个旧文件名改成了哪个新文件名。如果发现改错了,打开日志对照一下就知道哪里出了问题。
第二层是回滚机制。 脚本里的success列表记录了所有成功改名的文件(新路径和旧路径都记了)。如果你想把改过的名字全部恢复成原来的样子,只需要在脚本最后加几行代码:
print("输入 r 并回车可回滚,直接回车退出:")choice = input()if choice == "r":for new_path, old_path inreversed(success): os.rename(new_path, old_path)print("已回滚所有改名操作")注意这里用了 reversed(success),倒序回滚是因为如果A改成了B,同时B又改成了C,正序回滚会冲突,倒序就能避免这个问题。
不过我还是要强调一句:运行脚本之前,先把整个文件夹复制一份做备份。 代码再可靠,也不如备份来得安心。尤其是第一次用的时候,先拿三五个文件试跑一下,确认结果没问题再批量处理。
不会写代码?让AI帮你改
你可能会想:我连Python都不会,万一我的需求跟这个不完全一样怎么办?很简单,把需求告诉AI,让它帮你改代码。
比如你想让脚本支持模糊匹配——Excel里的旧文件名只写了“张三”而不是“张三简历.pdf”,你希望自动找到包含“张三”的文件。你可以这样跟ChatGPT或豆包说:
我有一个Python批量重命名脚本,目前是精确匹配文件名。请帮我改成模糊匹配:Excel旧文件名列只写关键词(如“张三”),脚本自动在文件夹中查找文件名包含该关键词的文件。如果匹配到多个文件,跳过并在日志中记录。
再比如你的Excel格式不一样,旧文件名叫“原文件名”、新文件名叫“目标文件名”,直接告诉AI:“把代码里的‘旧文件名’和‘新文件名’分别改成‘原文件名’和‘目标文件名’。”
AI改完之后你对比一下关键逻辑,确认没问题就直接用。这比从零学编程快得多,代码本质上就是你的需求翻译器。
几个常见问题,提前给你踩好坑
运行提示“文件被占用”怎么办? 这通常是因为你要改名的PDF或Excel正在被其他程序打开。关掉所有相关程序(包括PDF阅读器、Excel、WPS),重新运行就行。日志里会记录哪些文件改名失败,不用全部重来。
Excel路径含中文报错? 如果你的文件夹路径或文件名里有中文,在代码里写路径时用原始字符串,在引号前面加个r,比如 excel_path = r"D:\简历\映射表.xlsx"。这样Python不会把反斜杠当成转义字符。
扩展名不匹配怎么办? 比如Excel里写的是“张三简历.pdf”,但实际文件是“张三简历.PDF”大写,或者实际文件是“张三简历.docx”。脚本会提示“未找到文件”并跳过。这时候你需要检查Excel和实际文件名是否一致,扩展名也必须对得上。
能改子文件夹里的文件吗? 当前脚本只处理当前文件夹。如果你需要递归处理所有子文件夹,可以让AI帮你把os.rename那一段改成用os.walk遍历,加几行代码就行。
不止按名单改名,这些变体场景也能用
这个脚本的核心思路是“建立映射关系 → 批量改名”,围绕这个思路可以变出很多花样。
批量加前缀或后缀。 比如季度末你要给所有合同文件加上“2026Q3_”的前缀,根本不需要Excel。用os.listdir遍历文件夹,每个文件名前面拼上前缀就行:
for filename in os.listdir(folder_path):if filename.endswith(".pdf"): os.rename(filename, f"2026Q3_{filename}")三行代码搞定。
按拍照日期重命名照片。 手机拍的照片文件名是IMG_20260823_143022.jpg这种还好,有些相机导出来是DSC0001.jpg完全看不出时间。可以用Pillow库读取照片的EXIF信息,把文件名改成“2026-08-23_14-30-22.jpg”这种格式。需要安装Pillow(pip install Pillow),然后用 Image.open(path)._getexif() 读取拍摄时间,逻辑跟上面的脚本一样,只是新文件名的来源从Excel变成了EXIF数据。
按文件内容关键词重命名。 比如一堆扫描合同,你想把每份合同里的“合同编号:XXX”提取出来作为文件名。可以用pdfplumber库读取PDF文本内容,用正则表达式提取编号,然后重命名。这个稍微复杂一点,但思路完全相同:找到旧文件 → 确定新名字 → 执行改名。
这些变体你都不需要自己从头写代码,把需求描述清楚丢给AI,它分分钟给你写好。关键是你要理解核心逻辑——映射关系从哪来,改名就怎么改。
写在最后
批量重命名这件事,看起来是个小问题,但真到了几百个文件堆在面前的时候,手动改的那种痛苦和焦虑,做过的人都懂。
30行代码不能让你变成程序员,但它能帮你把一下午的机械劳动压缩到3秒钟,把出错概率降到几乎为零。更重要的是,当你掌握了“读Excel → 批量处理”这个思路之后,类似的批量操作——批量转换格式、批量分类归档、批量提取信息——你都能用同样的方式解决。
工具的意义从来不是炫技,而是把人从重复劳动里解放出来,去做真正需要思考的事情。
如果你在使用过程中遇到了问题,或者有其他批量处理的需求,欢迎在评论区留言,我来帮你看看怎么用代码搞定。也欢迎把这篇文章转发给你身边正在被几百个文件折磨的同事——他们会感谢你的。
看完了别忘了点个“在看”,下次遇到批量改名的活儿,翻出这篇文章就能直接上手。
◆ 职场充电站
推荐工具:ChatGPT / 豆包 AI
不会写代码也没关系,把需求描述清楚丢给 AI,它就是你最强的批量处理助手