我的知识记录

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.txta-b.txt 都会变成 a_b.txtos.path.exists 检查会让后者跳过,提前预览看清楚。
  • 中文保留是按需的\u4e00-\u9fa5 覆盖常用汉字,生僻字可能被替换,按需扩范围。
  • 服务器场景:上传到 Linux/服务器后文件名最好全小写,可加一步 .lower()

Python 批量去除文件名空格特殊字符:规范命名必备

标签:

更新时间:2026-09-14 21:26:44

上一篇:Python 批量重命名文件教程:os.rename 实战详解

下一篇:Python 批量移动文件到指定目录:按规则归集文件