结论:用 os.rename() 配合 re.sub() 和 unicodedata.normalize() 处理文件名,须先清洗非法字符、规避保留名、防重名覆盖,并用 os.path.join() 安全遍历子目录。

直接说结论:用 os.rename() 配合 re.sub() 或 unicodedata.normalize() 处理,但必须先规避 Windows 路径非法字符和重复文件名问题,否则会静默失败或覆盖。
为什么 os.rename() 直接报错“Invalid argument”?
Windows 对文件名有硬性限制: : " / | ? * 和 ASCII 控制字符(0x00–0x1F)完全禁止;macOS/Linux 虽宽松,但 / 和空字符
