1. glob 是什么? #
glob 是 Python 标准库,用于按通配符模式查找文件路径,返回匹配的文件列表。
- 适合批量处理文件的场景:遍历所有
.py 文件、收集日志、清理临时文件等。
- 无需安装,直接
import glob 即可,底层在 Windows 和 Unix 上都能正常工作。
- 与
os.listdir() 只能列出目录内容不同,glob 支持 *、? 等模式匹配,更灵活。
import glob
files = glob.glob("*.txt")
print(files)
2. 通配符规则 #
* 匹配任意长度的任意字符(不含路径分隔符),如 *.py 匹配当前目录所有 Python 文件。
** 匹配任意层级(包括子目录)中的任意字符,常与 recursive=True 配合递归查找,如 **/*.py 可以匹配所有子目录下的 Python 文件。
? 匹配单个任意字符,如 file?.txt 匹配 file1.txt、fileA.txt。
[seq] 匹配方括号中的任意一个字符,如 [abc].txt 匹配 a.txt、b.txt、c.txt。
- 项目中 90% 的场景只需
* 和 **(递归),? 和 [] 了解即可。
| 通配符 |
含义 |
示例 |
* |
任意字符(单层) |
*.log |
? |
单个字符 |
data?.csv |
[abc] |
a、b、c 之一 |
[Tt]est.py |
** |
递归匹配子目录 |
**/*.py |
3. 基本用法:glob.glob() #
glob.glob(pattern) 返回所有匹配路径的列表,没有匹配时返回空列表 []。
- 默认只搜索当前目录一层,不会进入子目录(除非使用
** 递归)。
- 路径分隔符在 Windows 上可用
/ 或 \\,推荐统一用 / 或 pathlib 拼接。
- 结果顺序不保证,需要排序时用
sorted(glob.glob(...))。
import glob
py_files = glob.glob("*.py")
print(py_files)
logs = glob.glob("logs/*.log")
print(logs)
images = glob.glob("*.png") + glob.glob("*.jpg")
print(images)
for path in sorted(glob.glob("data/*.csv")):
print(path)
4. 递归匹配 #
** 表示递归进入所有子目录,需配合 recursive=True 参数使用。
- 适合在项目中查找所有源码文件、配置文件,如
**/*.py、**/config.json。
- 大型目录树中递归搜索可能较慢,结果较多时考虑用
glob.iglob() 逐条迭代,节省内存。
- Python 3.5+ 也常用
pathlib.Path.rglob() 做递归匹配,与 glob 功能类似。
import glob
all_py = glob.glob("**/*.py", recursive=True)
print(all_py)
all_logs = glob.glob("project/**/*.log", recursive=True)
print(all_logs)
import glob
for path in glob.iglob("**/*.py", recursive=True):
print(path)
from pathlib import Path
p = Path('.')
for pyfile in p.rglob('*.py'):
print(pyfile)
5. 实用示例 #
- 下面三个场景是项目中最常见的 glob 用法:批量读取、批量删除、统计文件。
- 处理文件时建议先
print 确认匹配列表,避免误删或误处理。
- 配合
os.path 或 pathlib 可进一步判断是文件还是目录、获取文件大小等。
- 写脚本清理或迁移文件时,glob 比手动遍历目录简洁得多。
5.1 批量读取文件 #
import glob
for path in sorted(glob.glob("data/*.json")):
with open(path, encoding="utf-8") as f:
print(f"读取: {path}")
5.2 批量删除临时文件 #
import glob
import os
for path in glob.glob("temp/*.tmp"):
os.remove(path)
print(f"已删除: {path}")
5.3 统计项目中的 Python 文件 #
import glob
py_files = glob.glob("**/*.py", recursive=True)
print(f"共 {len(py_files)} 个 .py 文件")
for path in py_files[:5]:
print(f" {path}")
6. 常见错误与注意事项 #
glob("*.py") 只匹配当前目录,不匹配子目录中的文件,需要子目录请用 subdir/*.py 或 **/*.py。
- 模式写错不会报错,只会返回空列表,调试时先
print(glob.glob(pattern)) 确认匹配结果。
** 递归必须传 recursive=True,否则 ** 会被当作普通字符处理。
- Windows 路径含空格或特殊字符时,用原始字符串
r"C:\my data\*.txt" 避免转义问题。
import glob
files = glob.glob("**/*.py")
files = glob.glob("**/*.py", recursive=True)
7. 总结 #
glob 用通配符模式批量查找文件,核心是 glob.glob(pattern) 和 glob.iglob(pattern)。
- 日常最常用:
* 单层匹配、**/*.ext + recursive=True 递归匹配。
- 批量处理、清理、统计文件时首选 glob,比手写
os.walk + 字符串判断更简洁。
- 更现代的路径操作可配合
pathlib.Path.glob() / rglob(),与 glob 模块互通。
7.1 速查 #
import glob
glob.glob("*.txt")
glob.glob("src/*.py")
glob.glob("**/*.py", recursive=True)
glob.iglob("logs/*.log")
sorted(glob.glob("data/*.csv"))
7.2 最佳实践 #
- 匹配后先打印列表确认,再执行删除或修改操作
- 大量文件用
iglob 迭代,避免一次性加载到内存
- 递归搜索大项目时注意性能,可缩小范围如
src/**/*.py
- 路径拼接优先用
pathlib 或 os.path.join,减少硬编码分隔符