当前位置: 首页 > news >正文

Python `glob` 库详解:优雅高效地批量匹配文件路径

在 Python 中处理文件路径时,尤其是批量查找满足特定模式的文件(如查找所有 .txt 文件或子目录中的所有 .jpg 文件)glob 是一个非常实用的标准库。它使用类似 Unix Shell 的通配符规则,帮助你轻松完成文件路径的匹配工作。

本文将深入介绍 Python 的 glob 模块,从基本语法到实际应用,再到高级技巧与最佳实践,全面解析这个“文件路径查找利器”。


一、glob 模块简介

glob 是 Python 的标准库之一,无需额外安装,专门用于文件名的模式匹配搜索。它的名字来源于 Unix shell 命令中的“globbing”,意思是使用通配符进行匹配。

常见应用场景包括:

  • 批量读取某个目录下的图片、文本、日志等文件
  • 在子目录中递归查找特定类型的文件
  • 配合 osshutil 实现批量文件复制、删除、重命名等操作

二、通配符模式基础

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.pathpathlib 联合使用

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

特性globos.listdirpathlib
通配符匹配✅ 支持❌ 不支持,需要手动过滤✅ 支持 .glob()
递归搜索✅ 支持 (**)❌ 需手动递归遍历rglob() 更简洁
返回类型str 列表str 列表Path 对象生成器
使用习惯类 Unix shell 风格简单、通用面向对象、现代化

📝 建议在新项目中逐渐迁移至 pathlib,但 glob 的通配能力仍不可替代。


九、常见问题与误区

9.1 glob 不返回文件?

  • 检查路径是否正确(相对/绝对路径)
  • 注意区分大小写(特别是 Linux)
  • **/*.py 要配合 recursive=True

9.2 无法匹配隐藏文件?

glob("*") 默认不会匹配以 . 开头的文件,需要明确指定:

glob.glob(".*")  # 匹配隐藏文件

十、总结与最佳实践

glob 是处理文件路径批量操作的利器
✅ 支持通配符、递归、灵活组合
✅ 可与 ospathlibPILshutil 等库组合处理复杂任务
✅ 对于大规模目录扫描,推荐使用 pathlib.rglob() 更高效


参考链接

  • Python 官方文档 - glob
  • Python pathlib 文档
  • fnmatch 模式匹配

http://www.xdnf.cn/news/976123.html

相关文章:

  • 在 Java 中实现一个标准 Service 接口,并通过配置动态选择具体实现类供 Controller 调用
  • 用Woot助力Prime Day
  • 深入解析Docker网桥模式:从docker0到容器网络的完整通信链路
  • TBrun测试工具使用教程(Windows)
  • R语言缓释制剂QBD解决方案之一
  • 开源项目实战学习之YOLO11:12.9 ultralytics-models-sam-amg.py
  • 如何选择合适的IP轮换周期
  • 建筑末端配电回路安全用电解决方案:筑牢电气防火最后一道防线
  • 句法分析 自然语言处理
  • thinkphp ThinkPHP3.2.3完全开发手册
  • React前端框架学习
  • 腾讯云TVP走进泸州老窖,解码AI数智未来
  • 机器学习与深度学习19-线性代数02
  • 青少年编程与数学 01-011 系统软件简介 14 Foxpro数据库
  • 【从零开始学习JVM | 第六篇】运行时数据区
  • 使用Apache POI操作Word文档:从入门到实战
  • 【android bluetooth 框架分析 04】【bt-framework 层详解 2】【如何配置和启动蓝牙profile服务】
  • 【多线程初阶】详解线程池(下)
  • PROFINET主站(M580)通过网关访问CANopen从站(NJ系列)的技术解析
  • 深度强化学习 | 详细推导随机/确定性策略梯度定理
  • Flutter setState() 状态管理详细使用指南
  • 使用 C/C++、OpenCV 和 Libevent 构建联网人脸识别考勤系统 [特殊字符]‍[特殊字符]
  • 电机控制基础,小白入门篇
  • 第三章支线六 ·数据幻域 · 状态管理与数据流
  • Android 默认第三方app运行权限(android11-13)
  • 小程序 UI 设计,怎样在方寸间实现高效交互
  • Fastapi + vue3 自动化测试平台(6):AI + Web UI的完美结合
  • 把下载的ippicv.tgz放入<opencv_build_dir>/3rdparty/ippicv/download/中cmake依然无法识别
  • 快速了解JVM的GC历史
  • 【Lua热更新知识】学习三 XLua学习