glob.glob()仅支持shell通配符(、?、[abc]),不支持正则语法;递归需recursive=True且模式含*;正则匹配应改用pathlib.Path.rglob()配合re;Windows下大小写敏感需手动处理;避免全局递归扫描以提升性能。

glob.glob() 不能用正则,只能用通配符
很多人一上来就写 glob.glob(r".*.py$"),结果啥也找不到——glob 根本不支持正则语法,它只认 *、?、[abc] 这类 shell 风格通配符。正则里的 ^、$、. 全部无效,会被当字面量处理。
常见错误现象:glob.glob("*.py") 能匹配上,但 glob.glob(".*.py")(想匹配隐藏的 .xxx.py)却返回空列表——因为 . 在 glob 中不是元字符,它就是个点,而文件名开头的点默认不被 * 匹配(除非显式写出)。
- 要匹配隐藏 Python 文件,得写
glob.glob(".*.py")或更稳妥的glob.glob(".[a-zA-Z0-9]*.py") - 递归查找必须加
recursive=True,且模式里得含**,比如glob.glob("**/*.py", recursive=True) -
**只在 Python 3.5+ 支持,旧版本会静默忽略,结果只查当前目录
想用正则?换 pathlib + re.match()
真要靠正则过滤文件名,glob 不是正路。pathlib.Path.rglob() 搭配 re.fullmatch() 或 re.search() 更直接、可控。
使用场景:比如找 “以 test_ 开头、中间有数字、后缀为 .py” 的文件(test_123_handler.py),通配符写不出来,正则一行搞定。
示例:
import re
from pathlib import Path
pattern = re.compile(r"^test_d+_[a-z]+.py$")
py_files = [f for f in Path(".").rglob("*.py") if pattern.match(f.name)]
-
Path.rglob("*.py")先快速筛出所有 .py 文件,再用正则细筛,比全量os.walk()+ 正则快不少 - 注意用
f.name(不含路径)还是f.stem(不含后缀)做匹配,别误用f.as_posix()导致路径分隔符干扰正则 - 如果正则本身很重(比如带大量回溯),建议预编译
re.compile(),避免循环里重复编译
Windows 下大小写不敏感,但 glob 默认区分
在 Windows 上,foo.py 和 FOO.PY 是同一个文件,但 glob.glob("*.py") 默认不会匹配到大写的 FOO.PY——因为 glob 底层调用的是系统路径 API,Python 的 glob 模块本身不做大小写归一化。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
容易踩的坑:CI 跑 Linux(严格区分),本地 Win(实际不区分),导致测试通过但部署失败。
- 跨平台安全做法:先用
glob.glob("*")拿到所有文件名,再用.lower().endswith(".py")过滤 - 或者统一转小写匹配:
[f for f in glob.glob("*") if f.lower().endswith(".py")] - 别依赖
case_sensitive参数——glob没这选项;pathlib的match()方法在 Windows 上自动不区分,但rglob()不受控,仍需手动处理
性能差?别让 glob 扫整个磁盘
glob.glob("**/*.log") 看似方便,但如果从根目录(如 / 或 C:\)开始递归,可能遍历几万目录,卡死或触发系统限制。
真实使用中,绝大多数需求其实限定在项目目录、日志子目录或配置指定路径,没必要无脑全局扫。
- 永远显式指定起始路径,比如
glob.glob("logs/**/*.log", recursive=True),而不是"**/*.log" - 如果目标文件有明确层级(如都在
data/2024/*/下),用两层glob:先glob("data/2024/*/"),再对每个子目录跑glob("*.csv") - 遇到超大目录(>10k 文件),考虑用
os.scandir()替代,它比glob更轻量,还能跳过子目录或提前终止
最常被忽略的一点:通配符越宽泛,glob 内部做的字符串比较越多;"*.py" 比 "**/*.py" 快一个数量级,能不用递归就别用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










