Python批量修改文件后缀扩展名:一键重命名所有文件类型
用Python pathlib批量修改目录下所有文件的扩展名,比如把.txt改成.md、.jpeg改成.jpg,自动跳过子目录,完整代码。
场景痛点
从某个系统导出的文件全是.jpeg后缀,上传平台只认.jpg;或者一批.txt笔记要统一改成.md做文档管理。手动右键重命名,几十个文件改到手酸,还容易改错。用Python脚本遍历目录,批量替换扩展名,几秒钟搞定。
用到的库
pathlib # 标准库
完整代码
from pathlib import Path
def batch_change_extension(
dir_path: str,
old_ext: str,
new_ext: str,
recursive: bool = False
) -> int:
"""
批量修改文件扩展名
:param dir_path: 目标目录
:param old_ext: 原扩展名,如 '.txt'
:param new_ext: 新扩展名,如 '.md'
:param recursive: 是否递归子目录
:return: 修改的文件数
"""
root = Path(dir_path)
# 统一后缀格式,确保以点开头
if not old_ext.startswith('.'):
old_ext = '.' + old_ext
if not new_ext.startswith('.'):
new_ext = '.' + new_ext
count = 0
# recursive=False用iterdir只看当前层;True用rglob递归
iterator = root.rglob('*') if recursive else root.iterdir()
for file in iterator:
if not file.is_file():
continue
if file.suffix.lower() != old_ext.lower():
continue
# 新文件名 = 原文件名去掉后缀 + 新后缀
new_name = file.stem + new_ext
new_path = file.with_name(new_name)
# 如果目标已存在,跳过避免覆盖
if new_path.exists():
print(f"[跳过] {file.name} -> {new_name} (目标已存在)")
continue
file.rename(new_path)
count += 1
print(f"[改名] {file.name} -> {new_name}")
print(f"\n完成:共修改 {count} 个文件")
return count
if __name__ == "__main__":
batch_change_extension(
dir_path="./notes",
old_ext=".txt",
new_ext=".md",
recursive=True
)
代码讲解
file.suffix:文件扩展名,如.txt。file.stem:去掉扩展名的文件名主体。组合file.stem + new_ext得到新文件名。file.with_name(new_name):把当前路径的文件名部分替换成新名字,目录保持不变。比字符串拼接更安全,自动处理路径分隔符。recursive开关:False时用iterdir()只遍历当前目录;True时用rglob('*')递归所有子目录。- 冲突保护:如果新文件名已经存在,跳过不覆盖,避免误删数据。这是重命名脚本必须有的安全检查。
- 后缀大小写不敏感:
.TXT和.txt统一按小写比较,Windows文件系统本身不区分大小写。
运行结果
脚本遍历notes/目录(含子目录),把所有.txt文件改名为.md,逐个打印改名记录。例如:
[改名] 日报.txt -> 日报.md
[改名] 会议记录.txt -> 会议记录.md
[跳过] 笔记.txt -> 笔记.md (目标已存在)
完成:共修改 2 个文件
注意事项
- 重命名操作不可逆。正式跑之前先把
file.rename(new_path)注释掉,只打印新名字确认无误再执行。 - 如果新旧后缀相同(比如都是
.txt),脚本会因为new_path.exists()立即跳过,不会出问题。 - 修改扩展名不会改变文件实际内容。把
.png改成.jpg文件照样打不开,浏览器看实际数据。

更新时间:2026-09-14 21:31:15