<p>Windows文件名必须移除9个禁用字符: / : * ? " < > |,且禁止使用CON、PRN等保留名,首尾空格和结尾句点会被截断,单文件名不超255字符。</p>

Windows系统下哪些字符必须从文件名中移除
Windows对文件名有硬性限制,:、*、?、"、、<code>>、|、/、 这9个字符在任何位置都不能出现,否则 os.rename 或 open 会直接抛出 OSError: [Errno 22] Invalid argument。注意:. 和空格是合法的(只要不作为结尾),但开头的空格或连续点号(如 ..txt)可能引发其他问题。
用 re.sub 替换非法字符的稳妥写法
别直接写 re.sub(r'[\:*?"|/]', '_', name) —— 在字符串里要转义,正则里又要转义,容易漏掉一层。更安全的是用原始字符串 + 显式列出所有字符:
import re
def sanitize_filename(name):
# 匹配所有Windows非法字符,包括反斜杠和冒号
return re.sub(r'[\/*?:"<>|]', '_', name)
- 用
_替换比删掉更安全:避免产生空文件名或重复名称(如多个???.txt全变成.txt) - 不要用
W(匹配非单词字符):它会误杀中文、emoji、带重音的字母(如café→caf_) - 如果需兼容Linux/macOS,可额外过滤