我的知识记录

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,但递归替换误操作面更大。

Python 批量替换文件名中的文字:一键改命名规范

标签:

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

上一篇:Python批量同步两个文件夹教程

下一篇:Python 按序号批量重命名文件:照片报表编号实战