glob模块默认不递归查找子目录,*仅匹配当前层级,需用**/*.py并设置recursive=True才可遍历所有子目录;Windows路径分隔符混用易致模式失效;iglob省内存适合遍历,glob返回列表支持索引和统计;大小写匹配依赖文件系统,跨平台应避免直接使用。

glob 模块确实能快速查特定后缀文件,但默认不递归、不区分大小写、路径分隔符易出错——用错参数反而比 os.walk 还慢。
为什么 glob.glob 查不到子目录里的 .py 文件
因为 glob.glob 默认只匹配当前层,* 不会穿透子目录。比如 glob.glob("*.py") 只扫当前目录,src/*.py 也只扫 src 下一级。
- 要进子目录,必须显式写
**,且需传recursive=True - Windows 下路径用反斜杠
\,但glob内部按正斜杠/解析,混用会导致模式失效 -
**必须和recursive=True配对,否则直接忽略
正确写法:
import glob<br>files = glob.glob("**/*.py", recursive=True)
glob.iglob 和 glob.glob 到底选哪个
iglob 返回生成器,glob 返回列表。如果只是遍历处理、不存全部路径,iglob 更省内存,尤其在大目录中。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 需要统计总数、随机访问、重复迭代 → 用
glob.glob - 边找边处理(如逐个读取、校验、删除)→ 用
glob.iglob -
iglob不支持len(),也不能用索引,误用会报TypeError
示例(安全遍历):
for path in glob.iglob("**/*.log", recursive=True):<br> if os.path.getsize(path) > 1024 * 1024:<br> print(path)
后缀大小写问题:Linux 找不到 .JPG,Windows 却能匹配
glob 本身不处理大小写,完全依赖底层文件系统行为。Linux 区分大小写,*.jpg 不会匹配 IMG.JPG;Windows 不区分,所以“看似能用”,但代码跨平台就崩。
- 最稳方案:用
pathlib.Path+str.lower()过滤,或改用fnmatch配合os.walk - 若坚持用
glob,可手动拼多个模式:glob.glob("**/*.[jJ][pP][gG]")(仅限简单后缀) - 注意:
[jJ][pP][gG]在某些 shell 环境下会被提前展开,Python 字符串里得确保是原样传给glob
性能陷阱:为什么加了 ** 后变慢十倍
** 触发全树遍历,但 glob 每次都从根开始解析路径,遇到深层嵌套(如 node_modules)会反复进入无用子目录。
- 避免
**扫整个磁盘:限定起始路径,如"src/**/*.py"而非"**/*.py" - 排除干扰目录:先用
os.listdir过滤掉已知大目录,再对剩余目录调用glob - 真正大批量场景(>10万文件),
os.scandir+ 手动递归比glob快 3–5 倍,且可控性更强
关键点就一句:glob 是便捷胶水,不是重型扫描器。路径越具体、范围越小,它越靠谱。

















