glob.glob()返回完整路径列表,一次性加载所有匹配结果到内存;glob.iglob()返回生成器,按需逐项产出,适合大规模文件匹配以避免内存暴涨。

glob 模块在生产环境里不能直接用于跨目录递归匹配带空格或特殊字符的文件名,且不支持正则语法——它只做 shell 风格的简单通配,但胜在标准库、无依赖、启动快。
glob.glob() 和 glob.iglob() 的核心区别在哪?
glob.glob() 返回完整路径列表,一次性加载所有匹配结果到内存;glob.iglob() 返回生成器,适合匹配成千上万个文件的场景(比如日志归档目录),避免内存暴涨。
- 生产中日志路径
/var/log/app/*.log匹配时,用iglob更稳妥 -
glob.glob()在路径不存在时返回空列表,不会报错;但若父目录权限不足,会抛PermissionError - 两者都不自动处理编码问题:如果文件名含非 UTF-8 字节(如某些旧系统 Latin-1 编码的日志),
glob可能静默跳过或报UnicodeDecodeError
如何安全匹配含空格、括号、方括号的文件名?
shell 风格通配符本身不转义空格,glob 也不会帮你处理。比如想匹配 backup (2024).tar.gz,不能写 glob.glob("backup (*.tar.gz")——这会错误匹配 backup 2024.tar.gz、backup x.tar.gz 等。
- 真正要精确匹配括号,得用字符类:
glob.glob("backup [(]2024[)].tar.gz"),其中[()]表示字面量括号 - 空格无需转义,但路径字符串本身得是合法 Python 字符串:用原始字符串更安全,比如
r"/data/output/2024-06-*.csv" - 方括号
[abc]是通配符,如需匹配字面量[err],必须写成[[]err[]](注意两对方括号)
为什么 ** 递归模式在 Python 3.5+ 才可靠?
旧版 Python(** 不支持 recursive=True 参数,硬写 **/*.py 会被当作字面量路径,根本不会递归。
- Python 3.5+ 必须显式传参:
glob.glob("**/*.log", recursive=True) - 该模式底层调用
os.scandir(),性能比多次os.listdir()好,但依然比pathlib.Path.rglob()少一层抽象 - 注意:
**不会自动跳过符号链接循环,生产中若存在软链指向父目录,可能陷入无限遍历(需自行加深度限制或用pathlib+resolve()去重)
生产脚本里别只信 glob 的“看起来匹配到了”,务必用 os.path.isfile() 或 pathlib.Path().is_file() 二次确认——因为 glob 也会返回已删除但未清 inode 的“幽灵路径”(尤其 NFS 或容器挂载卷)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











