Python批量重命名文件:从手工操作到脚本自动化

发布时间:2026/9/3 14:54:25
Python批量重命名文件:从手工操作到脚本自动化 看完这篇你可以把“批量重命名”从手工重复劳动里彻底拿出来不再靠 F2 逐个按也不怕改到一半发现规则错了而是像写一段脚本需求一样先定好规则、跑一遍预览、再交给 Python 去执行。整个过程可以用三行代码起步也可以扩展成处理几万个文件的自动化工具。这是开发、测试、运营、设计甚至普通办公场景里最常见的需求某天你需要把导出的几百份 PDF 改成“合同编号_客户名”的格式或者把相机导出的IMG_1234.CR2全部整理成项目A_日期_序号也可能系统刚吐出两万多个无规则命名的报表文件。如果是批量重命名 10 个、20 个文件手工处理没问题一旦到了几百个、几千个甚至几万个就会遇到两个麻烦第一是慢第二是中途极易出错而且有些错误不可恢复。Windows 自带的“全选 F2”批量重命名只能按固定规则加序号没办法做复杂映射更没办法处理多层子目录里的文件。Linux/macOS 的 shell 命令虽然能处理但对没有长期使用命令行的同学来说语法记忆成本稍高。Python 的优势不在算法花哨而是它把“重命名”抽象成了一个非常朴素、非常安全的过程枚举文件 - 计算新文件名 - 试运行预览 - 确认执行。你有一套可以审阅、可以回滚计划、可以断点续跑的脚本而不是只能靠鼠标点到底。这篇文章会用 3 个可复制的完整示例覆盖最常见的需求场景批量给文件加前缀、后缀或替换文件名中的字符把无序文件按自然顺序重新编号输出001、002、003之类规范文件名根据 Excel / CSV 中的映射关系把文件名批量改成清单一致的新名字。同时会给出 dry-run 试运行模板、常见报错排查表格、以及大规模重命名时的工程建议。强烈建议先把文章收藏等真正需要的时候直接照抄改路径和命名规则即可。1. 这篇文章真正要解决的问题很多教程一上来就丢代码但代码跑完只解决“单个案例”。我们先说清楚这个需求背后的通用痛点是什么。在日常开发或办公中这些场景很容易遇到批量重命名问题素材整理场景摄影、设计、视频剪辑同学拿到上千个DSC_0001.NEF、IMG_20250101_123456.jpg这样的默认文件名需要统一改成“客户名_拍摄地点_日期”方便后面检索。系统导出场景公司后台导出的合同、报表、订单文件文件名是一串无业务含义的 ID运营需要把这些文件重命名为可读清单。导出的 Excel 里有“旧文件名 - 新文件名”两列但文件本身有几千个靠手去找完全不可行。测试数据准备场景开发或测试需要生成大量带固定前缀、固定时间戳或递增序号的文件用来模拟接口上传、日志采集、任务调度等场景。程序产出物二次加工爬虫、数据采集脚本、批处理程序产出的文件命名往往比较粗糙不适合直接交付需要批量二次整理。如果采用手工方式我们算一笔账假设你熟悉快捷键每个文件平均需要 3 到 5 秒完成 F2、输入和回车处理 10000 个文件大概要 8 到 14 个小时。更严重的问题不是慢而是手误造成的文件覆盖。Windows 下如果新文件名和已有文件重复系统会提示覆盖而这个操作一旦确认旧文件很难找回。几万文件的操作里只要出现几个重名就足够让人头大。很多同学以为“批量重命名 某款小工具”其实工具能做的只是固定规则。真正灵活的是写几行脚本把重命名规则用代码表达出来。代码可以被 review可以在小范围文件上先试跑可以事后从日志里核对每一处变更。也就是说Python 批量重命名解决的不只是“自动化”更是**“可控”**——这件事在文件数量越大时越重要。2. Python 批量重命名的核心思路与基础概念2.1 核心 APIos.rename 与 pathlibPython 中完成重命名最核心的 API 有两个都在标准库里不需要安装任何第三方包。第一个是os.rename(src, dst)接收两个字符串参数旧路径和新路径。# 把当前目录下的 old.txt 改名为 new.txt import os os.rename(old.txt, new.txt)第二个是pathlib.Path.rename(dst)。pathlib是 Python 3.4 之后引入的面向对象路径库项目中更推荐使用因为路径拼接时不需要手工拼字符串能省掉很多os.path.join的麻烦。from pathlib import Path p Path(old.txt) p.rename(new.txt)下面用一个表格说明它们的核心差异比较项os.renamepathlib.Path.rename路径表示字符串 strPath 对象也接受字符串参数路径拼接用 os.path.join 或字符串拼接直接使用/运算符可读性中规中矩更接近自然路径写法推荐场景兼容老代码或快速脚本新项目、需要多次路径操作时是否标准库是是Python 3.4这里最关键的认知是重命名的本质是路径级别的操作。os.rename并不关心文件内容它只是把“旧路径”对应的文件移动到“新路径”上这个操作在同一磁盘分区内非常快。也就是说即使有几万个文件只要新路径也在同一目录下重命名几乎不会产生 IO 性能瓶颈瓶颈往往在你的规则设计和打印日志上。2.2 看清“文件名、主名、后缀名”三个概念写批量重命名时新手最容易在“后缀处理”上出问题。假设一个文件全名是report_v2.pdf那么文件名namereport_v2.pdf主名stemreport_v2后缀名suffix.pdf使用 pathlib 时这三个值分别对应from pathlib import Path p Path(report_v2.pdf) print(p.name) # report_v2.pdf print(p.stem) # report_v2 print(p.suffix) # .pdf很多错误都源于“我手动拼接时丢了后缀”。比如处理IMG_0001.CR2想改成“2025_IMG_0001.CR2”如果只改p.stem而不保留p.suffix就可能得到没有后缀或后缀重复的文件。常规做法是保留原后缀或者在计算时显式拼接出新后缀。2.3 批量重命名的通用流程枚举、计算、试运行、执行无论需求长什么样把它们拆开看都逃不开下面这四个环节枚举待处理文件找出目录下符合范围的文件排除子目录排除不需要处理的目标文件。计算新文件名根据当前文件名、序号、扩展名或映射表生成新的目标路径。试运行dry-run只打印出“旧文件名 - 新文件名”的对应关系不真正执行 rename。这一步是安全感的来源。确认执行当试运行结果符合预期后再真正调用 rename。网上很多批量重命名脚本“翻车”几乎都不是 Python 不会用而是跳过了第 3 步。等脚本执行完才发现规则里的序号少了一位、目标名字写重复了这时候再想反向恢复就得再写一个反向脚本代价非常大。因此文章中后面所有示例都会包含一个非常小的试运行开关建议直接把这段逻辑当模板保存。3. 环境准备与前置条件写本文涉及的 Python 批量重命名脚本环境要求非常低。只要你的电脑能运行 Python 3 即可操作系统可以是 Windows、Linux 或 macOS。如果你还没安装 Python可以先去官网下载最新稳定版安装时务必勾选“Add Python to PATH”选项已经装好的同学可以打开终端输入下面命令确认python --version输出类似Python 3.12.4版本以你本机实际安装为准。本文示例面向 Python 3.x如果你的版本是 3.9 或以上完全没有问题如果是 Python 2建议先升级因为pathlib等标准库的差异会带来不必要的麻烦。关于编辑器推荐使用 VS Code 或 PyCharmVS Code安装 Python 官方插件后可以直接右键运行脚本调试体验不错也很轻量。PyCharm适合写更复杂脚本项目结构、运行配置都很完善。也可以不装 IDE直接在终端里用 Python 运行.py文件这完全足够完成文件名重命名。本文的主体代码只依赖标准库也就是说不需要执行 pip install 任何依赖包。只有当你使用 Excel 的.xlsx文件作为映射表时才需要安装openpyxl这个会在第 5 节的扩展示例里单独说明。为了方便测试建议先创建一个实验目录在里面放十几个测试文件。例如新建demo_files/目录放入几个.txt、.jpg、.pdf文件。注意第一次跑脚本时千万不要直接指向你真正的几万文件目录先用小规模测试文件把规则验证清楚再在完整目录上执行。mkdir -p demo_files cd demo_files echo hello a_old.txt echo world b_old.txt # Windows 下可用 type nul a_old.txt当实验目录准备完成我们就可以开始搭建批量重命名脚本。4. 核心流程拆解这一节先不贴完整大段代码而是把流程中的每一步都说透因为批量重命名的难点从来不在某一个 API 上而是如何组织这几步逻辑。4.1 盘点目录内容打开 Python 脚本后第一件事通常是遍历目录列出所有文件打印前几个例子。如果直接写死os.rename(./xxx, ./yyy)一旦当前工作目录不是文件所在目录就会出现FileNotFoundError。推荐先把目标目录表示成一个Path对象from pathlib import Path folder Path(rD:\素材整理\照片) print(folder)之后无论是遍历还是拼接路径都统一使用这个folder变量。这样即使脚本从任何位置被调用只要路径是对的就不会因为“少了一层目录”而找不到文件。遍历目录时常见的坑是Path.iterdir()会把子目录也列出来。如果对子目录也做了 rename轻则命名混乱重则把目录结构破坏。所以枚举后要加一层is_file()过滤排除子目录。代码可以这样组织for path in folder.iterdir(): if not path.is_file(): continue print(path.name)这一步的输出仅用于“盘点”确认你准备操作的对象确实是文件。4.2 设计新文件名规则批量重命名的第二要素是“规则表达式”。例如给文件名加前缀2025_去掉文件名里的_old把扩展名改为大写按原文件名排序后重新命名为第001集.mp4读取映射表 old_name - new_name规则一般会用原path.stem、path.suffix以及一个序号变量拼接。新手最需要克制的是“想一口气让规则覆盖所有特殊情况”。比如文件名中混有空格、中文括号、特殊字符时建议先在文件列表里观察多样性和规律通常用一个正则替换、一个 f-string 就能覆盖 99% 的情况剩下 1% 单独处理。4.3 试运行绝不跳过试运行的代码模式和正式执行几乎一样区别只在于一个开关dry_run True if dry_run: print(f[DRY RUN] {src_path.name} - {new_name}) else: src_path.rename(dst_path)当你第一次运行脚本时dry_run设为True。查看输出结果确认没有文件被错误地改成同名、没有后缀错乱、没有把脚本自身当成重命名对象再把dry_run改成False。有人会觉得这样多了一步麻烦但在正式处理成千上万文件时这一步就是保命的。道理和上线前的预发布环境一样先在低风险环境验证再执行变更。4.4 执行重命名正式执行时一个完整的动作被封装成三件事判断目标路径是否已存在如果存在则跳过或告警调用Path.rename()执行重命名打印日志记录“旧 - 新”的对应关系。这里还有一个容易被忽略的点脚本本身如果放在目标目录里遍历目录时会把.py文件也算进去。比如你的脚本叫rename.py放在folder目录下folder.iterdir()会遍历到它然后你可能不小心把它也重命名了导致代码中断。需要处理这种情况常见办法是跳过当前脚本文件或者把脚本放在目标目录外执行。5. 完整示例与代码实现5.1 示例一批量加前缀、后缀或替换字符这个场景可以解决大多数“整理默认文件名”的需求。下面代码会把某目录下所有文件统一加上前缀并把文件名全部转为小写如果你只想加后缀逻辑也是一样。# 文件路径rename_demo1.py from pathlib import Path # 目标目录请改成你自己的目录 folder Path(./demo_files) # 试运行开关True 只预览False 才真正执行 dry_run True for src_path in folder.iterdir(): # 只处理文件跳过子目录 if not src_path.is_file(): continue # 跳过当前 Python 脚本自身 if src_path.name rename_demo1.py: continue old_name src_path.name # 新文件名规则加前缀 project_ 保留原扩展名 new_name fproject_{old_name} # 如果你想改成“去掉 old 字样”的做法可以这样写 # new_name old_name.replace(_old, ) dst_path folder / new_name # 关键保护目标文件已存在时跳过避免覆盖 if dst_path.exists(): print(f[SKIP] 目标文件已存在: {dst_path.name}) continue if dry_run: print(f[DRY RUN] {old_name} - {new_name}) else: src_path.rename(dst_path) print(f[OK] {old_name} - {new_name}) print(处理完成)代码的核心逻辑可以拆成几块来解释folder.iterdir()返回目录下的所有条目Path对象不是单纯字符串。所以在后面的folder / new_name中能直接拼接出完整路径。is_file()过滤掉目录也过滤掉一些临时符号链接或特殊文件。dry_run开关在没有真正改名之前先打印全部计划。dst_path.exists()默认保护宁可跳过也不要把已有文件覆盖掉。第一次运行时输出大致如下[DRY RUN] a_old.txt - project_a_old.txt [DRY RUN] b_old.txt - project_b_old.txt看到结果无误后将dry_run False再次执行python rename_demo1.py控制台会打印每次重命名的记录。5.2 示例二按序号批量重命名并补零第二个高频需求是给一批文件排出稳定的顺序。比如把视频文件夹里的1.mp4、2.mp4、10.mp4统一改成第001集.mp4、第002集.mp4、第010集.mp4。这一步经常踩的坑是Python 默认的字符串排序会按每一位字符比较导致的结果是第10集排在第2集前面。如果你想按业务顺序排序建议先按主名转成数字或者按文件创建时间、修改时间排序。# 文件路径rename_demo2.py from pathlib import Path folder Path(./videos) dry_run True # 提取目录中所有普通文件 files [f for f in folder.iterdir() if f.is_file()] # 方法一按文件名排序如果是“1.mp4, 2.mp4...”这种规范命名可先显式转数字 # files.sort(keylambda f: int(f.stem)) # 方法二按修改时间排序常用于按拍摄时间顺序重命名 # files.sort(keylambda f: f.stat().st_mtime) # 方法三如果文件名是普通字符串直接 sort 即可 files.sort(keylambda f: f.stem) for index, src_path in enumerate(files, start1): if src_path.name rename_demo2.py: continue old_name src_path.name # 使用 :03d 格式化不足 3 位自动补 0 new_name f第{index:03d}集{src_path.suffix} dst_path folder / new_name if dst_path.exists(): print(f[SKIP] 目标文件已存在: {dst_path.name}) continue if dry_run: print(f[DRY RUN] {old_name} - {new_name}) else: src_path.rename(dst_path) print(f[OK] {old_name} - {new_name})f字符串中的{index:03d}表示把整数index格式化为至少 3 位不足补 0。想输出 5 位就写:05d想改成001.mp4不保留中文前缀直接把 f-string 改成f{index:03d}{src_path.suffix}即可。值得强调的是如果你要按“第几集”这种业务顺序重命名但原文件名不是数字而是像第1话前半.mp4、第2话后半.mp4这样带有复杂标签的名字只靠简单 sort 不一定能得到正确顺序。此时建议优先判断原始列表是不是预期的顺序可以在试运行输出里肉眼排查前 20 个或者引入更精确的自然排序算法。因为文件重命名后会改变原来的顺序如果没有业务保障后续很难再找回原始对应关系。5.3 示例三根据 Excel / CSV 映射关系批量重命名第三个场景最贴近企业里的真实需求。很多时候后台系统导出的文件是一堆乱命名文件但另外会有一张清单表Excel 里有两列旧文件名和新文件名。例如old_name,new_name A001.pdf,合同-张三-202501.pdf A002.pdf,合同-李四-202501.pdf A003.pdf,合同-王五-202501.pdf你希望让文件实际名称变成 Excel 清单里的新名称。如果只有几十行手工还能勉强做但几百行甚至上万行时就必须用代码了。下面示例用标准库csv读取映射表。因为 CSV 格式最简单、通用而且不需要额外依赖。# 文件路径rename_demo3.py import csv from pathlib import Path folder Path(./data) map_file Path(rename_map.csv) dry_run True # 1. 读取 CSV 映射关系 name_map {} with map_file.open(r, encodingutf-8-sig) as f: reader csv.DictReader(f) for row in reader: old_name row[old_name].strip() new_name row[new_name].strip() if old_name and new_name: name_map[old_name] new_name print(f读取映射 {len(name_map)} 行) # 2. 遍历目录并执行重命名 for src_path in folder.iterdir(): if not src_path.is_file(): continue old_name src_path.name # 若旧文件名不在映射表中可以选择跳过并打印提示 if old_name not in name_map: continue new_name name_map[old_name] dst_path folder / new_name if dst_path.exists(): print(f[SKIP] 目标文件已存在: {dst_path.name}) continue if dry_run: print(f[DRY RUN] {old_name} - {new_name}) else: src_path.rename(dst_path) print(f[OK] {old_name} - {new_name})这段代码里很关键的一行是读取文件的编码参数encodingutf-8-sig如果你用 Windows 上的 Excel 或记事本保存 CSV文件很可能带有 UTF-8 BOM 头也就是开头字符\ufeff。使用utf-8-sig会自动移除这个不可见字符否则你会看到第一列第一个 key 永远匹配不上。如果映射表不是 CSV而是 Excel 的.xlsx文件你需要额外安装openpyxlpip install openpyxl安装完成后用下面这段代码替换读取映射表的部分即可from openpyxl import load_workbook wb load_workbook(rename_map.xlsx, read_onlyTrue) ws wb.active name_map {} for row_idx, row in enumerate(ws.iter_rows(values_onlyTrue)): if row_idx 0: # 跳过表头 continue old_name row[0] new_name row[1] if old_name and new_name: name_map[str(old_name).strip()] str(new_name).strip()实际上如果映射表很大转成 CSV 后读取会更轻量只有在需要保留 Excel 工作簿格式或直接读取单元格公式结果时才建议用openpyxl。6. 运行结果与效果验证示例代码只是写完还不够你需要一套“如何判断成功”的方法。6.1 执行方式在目标目录的上层打开终端执行对应脚本例如python rename_demo2.py在dry_run True的情况下你看到的是预览例如[DRY RUN] gossip1.mp4 - 第001集.mp4 [DRY RUN] gossip2.mp4 - 第002集.mp4如果脚本因为目录不存在而报错需要先确认路径是否写对。如果发现文件名乱序、补零位数不对可以在预览阶段停止修改代码而不是等到执行后再恢复。确认无误后把dry_run的值改为False再跑一次。正式执行时输出会变成[OK] gossip1.mp4 - 第001集.mp4 [OK] gossip2.mp4 - 第002集.mp46.2 验证脚本文件总数及前 20 个文件执行结束后用一个独立的脚本或一行 Python 命令检查目录结果from pathlib import Path folder Path(./videos) all_files [p for p in folder.iterdir() if p.is_file()] print(文件总数, len(all_files)) for p in sorted(all_files)[:20]: print(p.name)运行后检查三件事文件总数是否等于预期如果有文件被意外跳过总数会比之前少说明过滤条件可能误伤。前 20 个文件名是否符合规则尤其检查后缀是否正确保留、序号是否从 001 开始、是否有重复名字。目标目录里没有残留临时文件如果脚本不小心把.py本身改名或创建了异常文件一眼能看出来。6.3 如果失败第一步看哪里批量重命名失败时不要直接猜测按下面顺序排查看控制台输出的第一条错误是脚本语法错误、路径错误还是文件占用提示。如果提示FileNotFoundError检查是“旧路径不存在”还是“目标目录不存在”。如果提示PermissionError多半是文件正被其他程序占用或当前用户没有目录写入权限。如果显示[SKIP]数量很多请检查是否有重复命名或映射表是否匹配。7. 常见问题与排查思路这一节把实际使用中最高频的报错和现象整理成一个表格方便遇到问题时直接查。问题现象可能原因排查方式解决方案报错FileNotFoundError当前工作目录不在目标目录或相对路径写错打印folder.resolve()查看完整绝对路径在脚本中使用绝对路径或先执行cd到正确目录报错PermissionError文件正被 Excel、播放器、图片查看器占用或目录没有写权限关闭相关软件检查目录权限在 Windows 上关闭预览窗口和占用程序必要时以最小权限运行脚本目标文件被覆盖新旧文件名重复且没有做 exists 判断检查处理规则中的序号是否有同名源文件在 rename 前检查dst_path.exists()重名时跳过或输出日志中文文件名乱码或\ufeff出现在开头CSV 编码或 BOM 头问题打印读到的 first key 的repr()使用encodingutf-8-sig读取 CSVExcel 另存时选择 UTF-8 CSV部分文件没有被处理命名规则中过滤条件过严或脚本放在目录内被循环处理在枚举环节打印所有文件与过滤条件打印不符合条件文件名检查大小写、空格、后缀差异脚本重复执行后不断加前缀脚本没有排除已经符合新命名规则的文件检查日志中旧文件名是否已经是project_开头在重命名规则中增加判断已符合规则的直接跳过排序结果不对例如第10集出现在第2集前面文件名按字符串排序导致“10 2”打印排序后前 20 个文件检查使用自然排序或按数字 key、时间属性排序后再编号子目录被重命名或遍历报错iterdir()没有排除目录开启is_file()判断遍历时使用p.is_file()过滤Windows 路径包含空格和中文没有使用 Path 对象导致字符串拼接出错打印 src_path、dst_path 查看是否变成错误路径统一使用pathlib.Path进行路径拼接以上这些坑在正式处理几万文件前可能会遇到一小部分。不要等到执行的一瞬间才排查建议先用 10 个文件的小目录把所有问题暴露出来。8. 最佳实践与工程建议如果你只是临时处理一次文件上一节的示例已经足够。但如果批量重命名发生在测试环境准备、生产数据整理或团队协作中下面这些工程建议值得认真对待。8.1 所有脚本均保留 dry-run 开关任何重命名脚本都要默认支持试运行模式。不要只在调试阶段写预览正式使用时又临时删掉。更合理的做法是把dry_run设计成命令行参数或脚本上方的常量方便切换。例如import argparse parser argparse.ArgumentParser(description批量重命名工具) parser.add_argument(--dry-run, actionstore_true, help只预览不执行) args parser.parse_args()命令行运行时手动传入--dry-run参数。这样团队成员使用时也能轻松确认执行意图。8.2 不要原地“硬改”优先在副本或新目录操作如果你处理的文件非常宝贵或者源目录是一份原始素材建议先复制到临时目录在副本上验证整套脚本和命名规则再对真实目录执行。原因很简单操作系统里的 rename 虽然速度很快但一旦批量执行系统中没有“撤销重命名”的像撤销按钮一样方便的功能。文件被覆盖后绝大多数情况下无法挽回。这一点对“几万文件”场景尤为重要大目录操作耗时较长运行到一半中断后已经改名的文件不会自动回到原名。如果脚本没有日志事后排查难度极高。建议给脚本添加一个简单的变更日志# 在正式运行前打开日志文件每次重命名都记录一行 with open(rename_log.csv, a, encodingutf-8) as log_file: log_file.write(f{old_name},{new_name}\n)8.3 命名规则要可逆设计新文件名规则时尽量保留与旧文件名的可追踪关系。例如添加日期前缀、保留原始编号、把旧文件名作为分组标识写在日志中。实在无法保持时也至少要留一个旧名 - 新名的 CSV 清单。这样做不仅方便回滚也便于后续由别人审计。8.4 Windows 环境要处理非法字符Windows 文件名中不能包含\ / : * ? |。如果你的新名字来自 Excel 数据库很可能是“合同编号: 001”冒号在 Windows 下属于非法字符。脚本执行时会报错不要等报错才发现。建议在计算新名字时做一次过滤import re def clean_filename(name): # 把 Windows 不允许的直接字符替换为下划线 return re.sub(r[\\/:*?|], _, name)8.5 大目录分批处理与断点恢复说实话重命名本身不消耗大量资源几万个普通文件基本几秒到几十秒就能完成。但如果在网络盘、机械硬盘或杀毒软件实时扫描的环境下执行整体时间会被拉长。如果脚本跑到中途崩溃已经处理的部分和新规则混在一起重跑会不稳定。更稳妥的做法是给脚本增加“跳过已满足规则文件”的逻辑使它天然具备断点续跑能力。示例一中已经提到了跳过逻辑。这样即使中断再次运行也不会重复加前缀或把文件名改乱。8.6 涉及递归目录时选择稳定的遍历方式如果你的文件分散在多个子目录需要递归处理。虽然 Python 3.12 的Path.walk()是可用的新写法但为了兼容更多旧版本环境工程上仍推荐使用os.walk或glob.glob(**/*, recursiveTrue)这类跨版本稳定的遍历方式如下示例import os for root, dirs, files in os.walk(./素材库): for filename in files: full_path os.path.join(root, filename) print(full_path)os.walk会返回每个目录下的文件和子目录列表代码也更直观。对子目录里的文件做重命名时记得保留root变量否则拼接路径时很容易丢失上层目录。8.7 不要用管理员权限运行脚本与数据库变更一样文件重命名也需要遵循最小权限原则。不要为了省事就以管理员身份运行因为一个路径笔误可能影响更大范围。正常用户权限已经足够完成目录内文件的 rename 操作。如果某个目录确实没有写入权限优先在代码层面确认该目录归属而不是盲目提权。9. 总结与后续学习方向现在回到标题里那个问题几万个文件怎么快速重命名答案是不要靠手不要靠一个个重复操作而是把“怎么改名”定义成一段可预览、可审计、可回滚的脚本逻辑。Python 标准库中的os.rename、pathlib.Path.rename已经能覆盖绝大多数批量文件重命名需求三行代码可以做最简单的加前缀几十行代码可以处理基于映射表的重命名。整个过程里真正决定成败的不是代码本身而是你有没有在正式执行之前做 dry-run、有没有处理重名覆盖、有没有保留日志。这篇文章给出了三条主线用pathlib枚举目录并安全地执行单个重命名用补零格式化和排序逻辑实现批量序号文件重命名用 CSV 或 Excel 映射文件实现“清单驱动”的重命名方式。如果你今后在工作中遇到批量重命名可以直接把文中示例改成自己的目录和规则。建议先复制文件到测试目录开启dry_run并观察输出直到确认无误再把开关关闭。这样即使面对几万个文件也能放心执行。想继续深入的同学可以按这几个方向动手练习使用glob.glob(**/*, recursiveTrue)对多级子目录中的同名文件做全量检索与重命名学习正则替换把复杂的“去掉括号内容”“统一日期格式”等规则用re.sub实现给脚本增加.exe打包能力让不带 Python 环境的同事也能使用你写的批量重命名工具尝试把映射表与数据库或 API 对接让文件名规则来自业务系统而不再依赖手工维护 Excel。文件重命名只是 Python 文件自动化的一块拼图。等你熟练了pathlib和os.walk再碰到文件批量归档、目录结构整理和文件内容清洗也能沿用同一套“先预览、后执行、留日志”的思路。下次再被问到“几万个文件怎么办”时心里就有底了。