用pathlib遍历+rename()最稳,因其路径安全、不覆盖、自动处理中文编码;需手动检查目标存在性、用正则锚定替换、捕获具体异常、用绝对路径防陷阱,并自行校验改名结果一致性。

用 pathlib 遍历 + rename() 重命名最稳
直接用 os.rename() 或 shutil.move() 批量改名,容易在 Windows 上遇到“文件正被占用”或路径编码错误;pathlib 的 rename() 方法自带路径安全处理,且对象化操作更易控制条件。它默认不覆盖目标文件,避免误删,这点必须手动检查。
实操建议:
方科网络ERP图文店II版为仿代码站独立研发的网络版ERP销售程序。本本版本为方科网络ERP图文店版的简化版,去除了部分不同用的功能,使得系统更加精炼实用。考虑到图文店的特殊情况,本系统并未制作出入库功能,而是将销售作为重头,使用本系统,可以有效解决大型图文店员工多,换班数量多,订单混杂不清的情况。下单、取件、结算分别记录操作人员,真正做到订单全程跟踪!无限用户级别,不同的用户级别可以设置不同的价
- 用
Path("目录").glob("*.log")精准匹配,别用os.listdir()+ 字符串过滤,后者无法区分文件/目录,也难处理嵌套 - 重命名前务必加
if not target_path.exists():判断,pathlib不自动跳过冲突,硬覆盖会静默丢数据 - Windows 下路径含中文时,
pathlib自动处理编码,但若原始文件名是损坏的 bytes(比如从旧系统拷贝来),需先用surrogateescape解码再处理
re.sub() 替换文件名比字符串切片更可靠
用 filename[5:] 或 filename.replace("old_", "") 看似简单,但一旦遇到文件名格式不统一(比如有的带空格、有的多下划线、有的缺前缀),就会批量出错。正则能明确锚定模式,比如只替换开头的编号或固定分隔符后的部分。
常见错误现象:批量重命名后出现 FileNotFoundError,其实是源文件没被正则匹配到,脚本跳过了,但用户以为全处理了。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 写正则时加上
^和$锚点,比如re.sub(r"^(\d{4})_(.+)$", r"\2_\1", name),避免意外替换中间内容 - 对不确定的文件名,先用
print()输出匹配结果,别直接调rename() - 避免在正则中用
.*匹配文件扩展名——扩展名应由suffix属性单独处理,防止把.tar.gz错拆成.gz
重命名失败时,try/except 必须捕获具体异常
批量操作里一个文件失败不该中断整个流程,但也不能只写 except: 吞掉所有错误——这会让权限不足、磁盘满、路径太长等真实问题彻底隐身。
使用场景:自动化脚本跑在 CI 或定时任务里,没人盯终端,错误日志是唯一线索。
实操建议:
- 只捕获
FileExistsError、PermissionError、OSError(Windows 路径长度超 260 字符时抛这个) - 每个异常分支里记录完整路径和
str(e),比如print(f"Skip {src}: {e}"),别只打"failed" - 对
FileExistsError,可追加时间戳重试(如target.with_name(f"{target.stem}_{int(time.time())}{target.suffix}")),但得先确认业务是否允许
跨目录移动重命名要小心相对路径陷阱
想把 ./raw/a.txt 改成 ./done/a_v2.txt,如果直接 Path("raw/a.txt").rename("done/a_v2.txt"),实际会生成 ./done/a_v2.txt ——但这是相对于当前工作目录的,不是相对于原路径。一旦脚本 cd 过或被其他进程调用,路径就偏了。
性能影响:用绝对路径构造目标 Path 多几行代码,但避免了 90% 的“为什么本地跑得好线上就错”问题。
实操建议:
- 统一用
src.resolve()获取绝对路径,目标路径用dst_dir / new_name拼接,dst_dir也走resolve() - 不要依赖
__file__手动拼父目录,用Path(__file__).parent.parent / "done"更健壮 - 如果目标目录不存在,
rename()会报FileNotFoundError,得提前dst_dir.mkdir(parents=True, exist_ok=True)









