Python 3.5+才支持glob.glob("dir//.py", recursive=True),需确保路径含斜杠、避免裸;更推荐pathlib.Path("dir").rglob(".py"),语义清晰且跨平台安全。

直接用 glob.glob 加 recursive=True 参数,配合 ** 通配符即可,但必须注意 Python 版本和路径分隔符的细节。
Python 3.5+ 才支持 recursive=True 和 **
低于 3.5 的版本调用 glob.glob("src/**/*.py", recursive=True) 会静默忽略 recursive 参数,只查当前目录——不是报错,而是“假装没看见”,极易误判结果。
- 确认版本:
python -c "import sys; print(sys.version_info)",确保major >= 3且minor >= 5 - 写法必须是
**(两个星号),单个*不起递归作用 - Windows 下路径分隔符用
/或os.sep都行,但不要混用反斜杠(除非转义成\或用原始字符串r"dir***.txt")
** 必须紧跟在斜杠后,且不能单独出现在开头或结尾
常见错误写法:glob.glob("**/*.py") 看似合理,但在某些 shell 环境或旧版 Python 中可能被提前展开;更稳妥的是明确指定根路径,比如 glob.glob("src/**/*.py", recursive=True)。
- ✅ 正确:
glob.glob("logs/**/*.log", recursive=True) - ❌ 危险:
glob.glob("**/*.log", recursive=True)—— 可能匹配到意外的父级目录 - ⚠️ 注意:
glob.glob("src/**.py", recursive=True)不会递归,因为缺少/,**失效
替代方案:用 pathlib.Path.rglob 更直观可靠
如果你已习惯面向对象风格,pathlib 的 rglob 方法语义更清晰、行为更一致,且不依赖 recursive 参数开关。
立即学习“Python免费学习笔记(深入)”;
from pathlib import Path
py_files = list(Path("src").rglob("*.py"))
-
rglob总是递归,无需额外参数 - 返回
Path对象,可直接调用.read_text()、.stem等方法,不用再os.path拼接 - 跨平台路径处理天然安全,
Path("a/b").rglob("*.txt")在 Windows/macOS/Linux 行为一致
真正容易被忽略的是:无论用 glob 还是 pathlib,如果目标目录不存在,glob 返回空列表,而 Path("missing").rglob(...) 也返回空迭代器——不会报错,但后续代码若假设一定有匹配项,就会出逻辑漏洞。建议先用 Path("root").exists() 或 os.path.isdir() 做存在性校验。


















