、 复制 ,结果"> 跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Python如何处理文件名中的非法字符以防报错_利用正则re.sub过滤Windows禁忌词

Windows文件名需用白名单正则r'1'清洗,保留字母数字、点、下划线、短横线,再strip首尾空格/点/下划线/短横线,空名fallback为'unnamed',并预编译正则、避免重命名冲突。a-zA-Z0-9._- ↩ re.sub 里用 r'[:"/\|?*]' 才能真正覆盖 Windows 全部非法字符 很多脚本只写
r'[/*?:"|]'
,漏掉
、>
、
,结果 rename 时仍报
OSError: [WinError 123]
。Windows 实际禁止的字符是这 9 个:
、>
、
:
、
"
、
/
、
、
|
、
?
、
*
,正则必须全包含,且
和
/
都要转义——所以模式得写成
r'[:"/\|?*]'
。 别信
re.escape('string')
:它适合拼接动态字符,但静态列表手写正则更准、更快、无歧义。控制字符(
-
、

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

相关文章