Windows文件名需用白名单正则r'1'清洗,保留字母数字、点、下划线、短横线,再strip首尾空格/点/下划线/短横线,空名fallback为'unnamed',并预编译正则、避免重命名冲突。a-zA-Z0-9._- ↩
re.sub 里用 r'[:"/\|?*]' 才能真正覆盖 Windows 全部非法字符
很多脚本只写
,漏掉
、
,结果 rename 时仍报
。Windows 实际禁止的字符是这 9 个:
、
、
、
、
、
、
、
,正则必须全包含,且
和
都要转义——所以模式得写成
。
别信
:它适合拼接动态字符,但静态列表手写正则更准、更快、无歧义。控制字符(
、
)也要防,尤其从网页或剪贴板粘贴的文件名可能含不可见控制符,建议加进模式:
。
为什么推荐白名单模式 re.compile(r'[^a-zA-Z0-9._-]') 而非黑名单替换
黑名单模式(如上面的 9 字符匹配)只能删坏的,但留下的空格、中文、emoji、全角标点依然可能在某些场景出问题——比如 shell 脚本解析失败、云同步服务拒绝上传、Git 提交警告。
白名单更可控:
显式声明“只留这些”,其他一律干掉。注意三点:
立即学习
“
Python免费学习笔记(深入)
”;
点(
)必须保留,否则扩展名会丢,
可能变
短横线(
)比空格安全,适合作为单词分隔符,且 Windows 允许
别把空格放进白名单;统一替换成
,避免路径解析歧义
示例:
→
(中文被删,冒号问号被换,点保留在扩展名前)。
strip(' ._-') 和空名 fallback 是 rename 前最后也是最关键的一步
或白名单清洗完,名字可能变成
或
—— 这些不会触发正则匹配,但 Windows 直接拒绝创建:
报
。
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
必须额外做两件事:
调用
清首尾,去掉开头结尾的空格、点、下划线、短横线
检查清洗后是否为空字符串,是则设为
,否则
会崩
连续下划线(如
)虽不报错,但难读,建议再补一句:
压缩。
批量重命名时务必预编译正则、避免递归改名冲突
处理几百个文件时,如果每次循环都调用
,Python 会重复编译正则,性能明显下降。应提前用
编译一次,复用对象。
更隐蔽的坑是重命名顺序:若目录里有
和
,先改
,再处理
就会因目标已存在而失败。解决方法只有两个:
先收集所有原始名→新名映射,确认无冲突后再批量执行
或统一加时间戳后缀(如
),彻底避开同名竞争
别依赖
或
前就清洗——先用
或
/
拆出纯文件名,再清洗,否则正则可能误杀路径分隔符。
r'[/*?:"|]'、>OSError: [WinError 123]、>:"/|?*/r'[:"/\|?*]'re.escape('string')-r'[:"/\|?* -]'re.compile(r'[^a-zA-Z0-9._-]').'report.xlsx''report_xlsx'-'_'clean_pattern.sub('_', '测试 file:name?.txt')'_file_name_.txt're.sub' .my-file.. ''___'os.rename()[WinError 123].strip(' ._-')'unnamed'os.rename()'a__b're.sub(r'_+', '_', name)re.sub(r'...', '_', filename)re.compile()old:name.txtold_name.txtold:name.txt → old_name.txtold_name.txtold_name_20260413.txtos.path.basename()pathlib.Path.nameos.path.split().stem.suffix