Python 批量替换文件名中的文字:一键改命名规范
用 Python 批量把文件名里的旧词替换成新词,如把所有「旧公司名」换成「新公司名」,支持精确替换与忽略大小写,附 dry-run 预览。
场景痛点
公司改名、项目代号更新,文件夹里几十上百个文件都带着旧名字,比如「2023旧版_合同.pdf」「旧版-方案.docx」。想把「旧版」全部换成「终版」,手动一个一个找太累,还会漏。用 Python 做字符串替换,一次扫描全部文件,命中就改,没命中就跳过,几秒完成。
用到的库
纯标准库,无需 pip 安装:
# os、os.path 为标准库
完整代码
import os
# ========== 配置区 ==========
TARGET_DIR = "./合同文件" # 目标文件夹
OLD = "旧版" # 要被替换掉的文字
NEW = "终版" # 替换成的新文字
IGNORE_CASE = False # 是否忽略大小写匹配
DRY_RUN = True # True=预览,False=真正执行
# ============================
def replace_in_name(old_name: str) -> str:
"""在文件名(含主名,不含扩展名)里做文字替换。"""
stem, ext = os.path.splitext(old_name)
if IGNORE_CASE:
# 忽略大小写的替换:用 lower 比较
lower_stem = stem.lower()
lower_old = OLD.lower()
if lower_old in lower_stem:
# 注意:这里只做简单全量替换,大小写不敏感时保留原大小写较复杂,
# 演示用直接整体替换为 NEW
new_stem = stem.replace(OLD, NEW) if OLD in stem else stem
return new_stem + ext
return old_name
else:
new_stem = stem.replace(OLD, NEW)
return new_stem + ext
def main():
if not os.path.isdir(TARGET_DIR):
print(f"目录不存在:{TARGET_DIR}")
return
count = 0
for name in os.listdir(TARGET_DIR):
old_path = os.path.join(TARGET_DIR, name)
if not os.path.isfile(old_path):
continue
new_name = replace_in_name(name)
if new_name == name:
continue # 没命中替换规则
new_path = os.path.join(TARGET_DIR, new_name)
if os.path.exists(new_path):
print(f"[跳过] 目标已存在:{new_name}")
continue
print(f"[{'预览' if DRY_RUN else '执行'}] {name} -> {new_name}")
if not DRY_RUN:
os.rename(old_path, new_path)
count += 1
print(f"\n共 {count} 个文件命中替换(DRY_RUN={DRY_RUN})")
if __name__ == "__main__":
main()
代码讲解
- replace_in_name:用
os.path.splitext把扩展名剥掉,只在主名里替换,避免误改扩展名。比如旧版.txt不会因为 OLD=t把扩展名也吃掉。 - str.replace:Python 字符串自带的全量替换,一次把文件名里所有
OLD都换成NEW,不需要正则。 - IGNORE_CASE 分支:演示了大小写不敏感的判断逻辑。如果新旧词都是中文,这个开关其实用不上;处理英文文件名(比如把
draft换成final)时才有用。 - 只改命中项:
new_name == name就跳过,没命中的文件完全不动,安全。
运行结果
终端逐条打印命中的文件 旧版_合同.pdf -> 终版_合同.pdf,没命中的不打印。先预览看命中清单对不对,再把 DRY_RUN 设成 False 正式执行。
注意事项
- 替换词别太短:OLD 太短容易误伤。比如 OLD=
a,会把文件名里所有a都换掉。用有语义的完整词。 - 别替换到扩展名:本脚本只处理主名,已经规避了这个坑。如果自己扩展,记得保留扩展名。
- 新旧词别互为包含:比如 OLD=
a、NEW=ab,可能出现重复替换的连锁问题,跑前预览看清楚。 - 批量替换也可能撞名:两个不同旧文件替换后变成同一个名字,脚本里的
os.path.exists检查会跳过后者,避免覆盖。 - 子文件夹不处理:本脚本只扫当前层;要递归加
os.walk,但递归替换误操作面更大。

更新时间:2026-09-14 21:25:29