Python `glob` 库详解:优雅高效地批量匹配文件路径
在 Python 中处理文件路径时,尤其是批量查找满足特定模式的文件(如查找所有 .txt
文件或子目录中的所有 .jpg
文件),glob
是一个非常实用的标准库。它使用类似 Unix Shell 的通配符规则,帮助你轻松完成文件路径的匹配工作。
本文将深入介绍 Python 的 glob
模块,从基本语法到实际应用,再到高级技巧与最佳实践,全面解析这个“文件路径查找利器”。
一、glob
模块简介
glob
是 Python 的标准库之一,无需额外安装,专门用于文件名的模式匹配搜索。它的名字来源于 Unix shell 命令中的“globbing”,意思是使用通配符进行匹配。
常见应用场景包括:
- 批量读取某个目录下的图片、文本、日志等文件
- 在子目录中递归查找特定类型的文件
- 配合
os
或shutil
实现批量文件复制、删除、重命名等操作
二、通配符模式基础
glob
使用与 shell 类似的通配符规则:
通配符 | 含义 | 示例 |
---|---|---|
* | 匹配任意长度的任意字符 | *.txt 匹配所有 .txt |
? | 匹配任意一个字符 | file?.txt 匹配 file1.txt , fileA.txt |
[] | 匹配指定范围内的任一字符 | file[1-3].txt 匹配 file1.txt , file2.txt , file3.txt |
** | 匹配任意目录(需开启递归) | **/*.py 匹配任意子目录中的 .py 文件(需设置 recursive=True ) |
三、基本用法
3.1 查找当前目录下的所有 .txt
文件
import globfiles = glob.glob("*.txt")
print(files)
# 输出示例: ['data1.txt', 'report.txt']
3.2 匹配指定路径中的图像文件
image_files = glob.glob("images/*.jpg")
3.3 匹配多个后缀名(结合列表推导)
files = glob.glob("data/*.csv") + glob.glob("data/*.xlsx")
四、递归查找子目录文件(**
)
从 Python 3.5 开始,glob
支持递归模式:
files = glob.glob("**/*.py", recursive=True)
这会在当前目录及其所有子目录中查找 .py
文件。
💡 默认情况下
**
不递归,必须显式设置recursive=True
。
五、与 os.path
、pathlib
联合使用
5.1 获取文件名或绝对路径
import osfor file in glob.glob("logs/*.log"):print("文件名:", os.path.basename(file))print("绝对路径:", os.path.abspath(file))
5.2 使用 pathlib
更优雅地处理路径
from pathlib import Pathfiles = Path("data").glob("*.txt")
for file in files:print(file.name, file.stem, file.suffix)
六、高级使用技巧
6.1 查找以数字开头的文件
glob.glob("[0-9]*.txt")
6.2 多级目录下查找 .png
图像
glob.glob("*/**/*.png", recursive=True)
6.3 排除某些文件(结合 fnmatch
或过滤器)
import fnmatchfiles = [f for f in glob.glob("data/*.csv") if not fnmatch.fnmatch(f, "data/test_*.csv")]
七、实战案例:批量读取图片并处理
import glob
from PIL import Imageimage_paths = glob.glob("images/**/*.jpg", recursive=True)for path in image_paths:img = Image.open(path)print(f"{path}: {img.size}")
八、glob vs os.listdir vs pathlib
特性 | glob | os.listdir | pathlib |
---|---|---|---|
通配符匹配 | ✅ 支持 | ❌ 不支持,需要手动过滤 | ✅ 支持 .glob() |
递归搜索 | ✅ 支持 (** ) | ❌ 需手动递归遍历 | ✅ rglob() 更简洁 |
返回类型 | str 列表 | str 列表 | Path 对象生成器 |
使用习惯 | 类 Unix shell 风格 | 简单、通用 | 面向对象、现代化 |
📝 建议在新项目中逐渐迁移至
pathlib
,但glob
的通配能力仍不可替代。
九、常见问题与误区
9.1 glob
不返回文件?
- 检查路径是否正确(相对/绝对路径)
- 注意区分大小写(特别是 Linux)
**/*.py
要配合recursive=True
9.2 无法匹配隐藏文件?
glob("*")
默认不会匹配以 .
开头的文件,需要明确指定:
glob.glob(".*") # 匹配隐藏文件
十、总结与最佳实践
✅ glob
是处理文件路径批量操作的利器
✅ 支持通配符、递归、灵活组合
✅ 可与 os
、pathlib
、PIL
、shutil
等库组合处理复杂任务
✅ 对于大规模目录扫描,推荐使用 pathlib.rglob()
更高效
参考链接
- Python 官方文档 - glob
- Python pathlib 文档
- fnmatch 模式匹配