Python 批量去除文件名空格特殊字符:规范命名必备
用 Python 批量清理文件名里的空格、中文括号、斜杠等特殊字符,统一转成下划线或短横线,避免命令行、脚本、服务器处理时报错。
场景痛点
从 Windows 共享盘、微信、邮件附件拷来的文件,名字经常带空格、全角括号、中文标点,比如「项目 方案(终版).docx」。这些名字在命令行、Python 脚本、服务器部署、网页上传里到处出问题:空格要转义、斜杠被当成路径分隔符、某些特殊字符直接报错。批量清洗成 项目_方案_终版.docx,后面所有自动化都顺。
用到的库
纯标准库,无需 pip 安装:
# os、os.path 为标准库
完整代码
import os
import re
# ========== 配置区 ==========
TARGET_DIR = "./待清理"
REPLACE_CHAR = "_" # 特殊字符统一替换成什么
DRY_RUN = True
# ============================
# 允许保留的字符:中文、英文、数字、点、短横线、下划线
# 其余字符(空格、括号、斜杠、冒号等)一律替换
KEEP_PATTERN = re.compile(r"[^\u4e00-\u9fa5A-Za-z0-9._\-]")
def clean_name(old_name: str) -> str:
stem, ext = os.path.splitext(old_name)
# 把不允许的字符替换成 REPLACE_CHAR
new_stem = KEEP_PATTERN.sub(REPLACE_CHAR, stem)
# 把连续多个替换符压成一个,避免 "a b" 变成 "a__b"
new_stem = re.sub(rf"{re.escape(REPLACE_CHAR)}+", REPLACE_CHAR, new_stem)
# 去掉开头结尾的替换符
new_stem = new_stem.strip(REPLACE_CHAR)
return new_stem + ext
def main():
if not os.path.isdir(TARGET_DIR):
print(f"目录不存在:{TARGET_DIR}")
return
count = 0
for name in os.listdir(TARGET_DIR):
old_path = os.path.join(TARGET_DIR, name)
if not os.path.isfile(old_path):
continue
new_name = clean_name(name)
if new_name == name:
continue
new_path = os.path.join(TARGET_DIR, new_name)
if os.path.exists(new_path):
print(f"[跳过] 目标已存在:{new_name}")
continue
print(f"[{'预览' if DRY_RUN else '执行'}] {name} -> {new_name}")
if not DRY_RUN:
os.rename(old_path, new_path)
count += 1
print(f"\n共 {count} 个文件(DRY_RUN={DRY_RUN})")
if __name__ == "__main__":
main()
代码讲解
- KEEP_PATTERN:正则白名单,只保留中文(
\u4e00-\u9fa5)、英文、数字、点、短横线、下划线。其它字符——空格、全角半角括号、斜杠、冒号、井号——全部命中并替换。 - sub 连续压缩:多个连续特殊字符(比如两个空格、
(终版)两边的括号)会变成多个_,再用一条正则压成单个_,名字更干净。 - strip 收尾:去掉首尾多余的下划线,避免
_a_.txt这种。 - 扩展名保留:清洗只作用于主名,
.docx.pdf不动,避免把扩展名里的点也清掉。
运行结果
终端打印「项目 方案(终版).docx -> 项目_方案_终版.docx」这样的对照。预览确认清洗规则没误伤正常字符,把 DRY_RUN 改成 False 正式执行。
注意事项
- 正则白名单可调:如果你的文件名里有特殊业务符号(比如
#、@)想保留,把它加进KEEP_PATTERN的字符类里。 - 别误删扩展名里的点:本脚本只清主名,安全。自己改时别对全名做 sub。
- 两个不同文件可能洗成同名:
a b.txt和a-b.txt都会变成a_b.txt,os.path.exists检查会让后者跳过,提前预览看清楚。 - 中文保留是按需的:
\u4e00-\u9fa5覆盖常用汉字,生僻字可能被替换,按需扩范围。 - 服务器场景:上传到 Linux/服务器后文件名最好全小写,可加一步
.lower()。

更新时间:2026-09-14 21:26:44
上一篇:Python 批量重命名文件教程:os.rename 实战详解