Python 3.10 中用 pathlib + re 批量重命名最稳:glob 安全筛选文件,re.sub 精准清洗文件名,重命名前必须检查目标存在并备份,加 --dry-run 开关预览效果。

Python 3.10 的 pathlib + re 组合是批量重命名最稳、最易调试的方案,别碰 os.rename 直接裸用——容易覆盖、不报错、难回滚。
用 pathlib.Path.glob 安全筛选目标文件
手动写 os.listdir + 字符串过滤容易漏掉隐藏文件、误匹配目录,glob 支持通配符且返回 Path 对象,自带路径安全意识。
- 用
**/*.log匹配多层子目录下的日志文件,比递归os.walk更简洁 - 避免用
*匹配所有文件:先试list(p.glob("*.tmp"))看是否真有你要的文件 - 加
if f.is_file()判断,防止把同名目录当文件重命名(常见坑)
用 re.sub 做可预测的文件名清洗
硬编码字符串替换(如 .replace("old", "new"))在处理时间戳、随机哈希、空格变下划线等场景下极易出错;正则能明确约束“只改文件名不改后缀”“只动前缀不碰扩展名”。
- 推荐模式:
new_stem = re.sub(r"[^\w\s-]", "_", old_stem),清理非法字符但保留空格和短横 - 后缀必须保留:
f.with_name(new_stem + f.suffix),别写成f.parent / (new_stem + f.suffix)(丢失原始路径层级) - 测试时先打印
print(f"→ {f.name} → {new_path.name}"),确认无误再调用.rename()
重命名前必须检查目标路径是否已存在
Path.rename() 遇到同名文件会直接覆盖,且不提示——这是 Python 批量重命名脚本崩掉的头号原因。
- 用
if new_path.exists():检查,建议加计数器或跳过逻辑,比如new_path = f.with_name(f"{new_stem}_{i}{f.suffix}") - Windows 下注意大小写不敏感,
READ.ME和read.me视为冲突;Linux 下则要防硬链接误判 - 操作前用
shutil.copy2(f, backup_dir / f.name)备份原始文件(尤其处理照片、文档时)
真正麻烦的不是写 rename 逻辑,而是搞清原始命名规律——有些文件名里混着 UTC 时间戳、设备 ID、中文括号,正则得反复调;还有些文件权限为只读,rename 会抛 PermissionError,得提前 f.chmod(0o644)。留个 --dry-run 参数开关,永远不嫌多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











