在 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 ) |
.txt
文件import glob
files = glob.glob("*.txt")
print(files)
# 输出示例: ['data1.txt', 'report.txt']
image_files = glob.glob("images/*.jpg")
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
联合使用import os
for file in glob.glob("logs/*.log"):
print("文件名:", os.path.basename(file))
print("绝对路径:", os.path.abspath(file))
pathlib
更优雅地处理路径from pathlib import Path
files = Path("data").glob("*.txt")
for file in files:
print(file.name, file.stem, file.suffix)
glob.glob("[0-9]*.txt")
.png
图像glob.glob("*/**/*.png", recursive=True)
fnmatch
或过滤器)import fnmatch
files = [f for f in glob.glob("data/*.csv") if not fnmatch.fnmatch(f, "data/test_*.csv")]
import glob
from PIL import Image
image_paths = glob.glob("images/**/*.jpg", recursive=True)
for path in image_paths:
img = Image.open(path)
print(f"{path}: {img.size}")
特性 | glob |
os.listdir |
pathlib |
---|---|---|---|
通配符匹配 | ✅ 支持 | ❌ 不支持,需要手动过滤 | ✅ 支持 .glob() |
递归搜索 | ✅ 支持 (** ) |
❌ 需手动递归遍历 | ✅ rglob() 更简洁 |
返回类型 | str 列表 |
str 列表 |
Path 对象生成器 |
使用习惯 | 类 Unix shell 风格 | 简单、通用 | 面向对象、现代化 |
建议在新项目中逐渐迁移至
pathlib
,但glob
的通配能力仍不可替代。
glob
不返回文件?**/*.py
要配合 recursive=True
glob("*")
默认不会匹配以 .
开头的文件,需要明确指定:
glob.glob(".*") # 匹配隐藏文件
✅ glob
是处理文件路径批量操作的利器
✅ 支持通配符、递归、灵活组合
✅ 可与 os
、pathlib
、PIL
、shutil
等库组合处理复杂任务
✅ 对于大规模目录扫描,推荐使用 pathlib.rglob()
更高效