glob.glob 递归匹配必须同时满足 recursive=true 和模式含 (且 前必须有 /),如 "src//.py";缺一不可,* 位置错误或缺失将导致仅匹配当前目录。

Python 3.5+ 的 glob.glob 支持递归匹配,但必须显式启用 recursive=True,且模式中需包含 ** —— 否则不会遍历子目录。
必须用 ** + recursive=True 才生效
很多人写 glob.glob("src/*.py") 然后加 recursive=True,结果还是只扫当前目录。因为 ** 是递归通配符,缺它就无效。
-
glob.glob("src/**/*.py", recursive=True)→ 正确,匹配 src 下所有层级的 .py 文件 -
glob.glob("src/*.py", recursive=True)→ 错误,**缺失,等价于不设recursive -
glob.glob("src/**/test_*.py", recursive=True)→ 匹配任意深度下以 test_ 开头的 .py 文件
** 必须紧跟在 / 后面,不能孤立使用
** 不是万能通配符,它的语义是“匹配零个或多个目录层级”,所以位置和分隔符很关键。
-
"**.py"→ 无效,**前没/,glob 会报错或静默忽略 -
"**/*.py"→ 正确,从当前目录开始搜所有 .py 文件 -
"src/**/*.{py,md}"→ 注意:**后仍要接/,否则{py,md}不会被展开(glob不支持 brace expansion)
注意路径分隔符与跨平台兼容性
Windows 用反斜杠 ,但 glob 内部统一按 POSIX 风格(正斜杠 /)解析模式。硬写 容易出问题。
- 推荐统一用正斜杠:
glob.glob("src/**/*.py", recursive=True),在 Windows/macOS/Linux 都能工作 - 避免写
"src\**\*.py"—— 双反斜杠在字符串里容易被误解,且**前后若为\,部分 Python 版本可能不识别 - 如果路径来自
os.path.join(),先用pathlib.Path.as_posix()转成正斜杠再拼接模式
性能提示:深层嵌套时慎用 **
** 会触发完整目录树遍历,遇到大量子目录或挂载点(如 /proc、Docker volumes)可能卡住或报 PermissionError。
- 若只需 2 层以内,改用多级 glob:
glob.glob("src/*.py") + glob.glob("src/*/*.py")更可控 - 捕获异常很重要:
try/except PermissionError,否则一次无权限目录就会中断整个搜索 -
pathlib.Path.rglob()行为类似,但返回Path对象,更易链式处理;不过底层仍是遍历,性能差异不大
真正容易被忽略的是:递归开关和 ** 必须同时存在,缺一不可;而且 ** 的位置比大多数人想的更严格——它不是“通配一切”,而是“通配目录层级”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











