python如何使用glob检索文件

发布时间:2022-02-19 16:53:48 作者:iii
来源:亿速云 阅读:177
# Python如何使用glob检索文件

## 目录
1. [glob模块简介](#glob模块简介)
2. [基本通配符使用](#基本通配符使用)
3. [递归文件搜索](#递归文件搜索)
4. [路径名模式匹配](#路径名模式匹配)
5. [glob与正则表达式对比](#glob与正则表达式对比)
6. [实际应用案例](#实际应用案例)
7. [性能优化建议](#性能优化建议)
8. [常见问题解答](#常见问题解答)
9. [总结](#总结)

<a id="glob模块简介"></a>
## 1. glob模块简介

glob是Python标准库中的一个模块,专门用于文件路径名的模式匹配。它源自Unix shell中的glob命令(global的缩写),提供了一种简单高效的方式来查找符合特定模式的文件路径。

### 主要特点:
- 跨平台支持(Windows/Unix)
- 支持基本的通配符(*, ?, [])
- 提供glob()和iglob()两个主要函数
- 与os模块无缝集成

### 基本导入方式:
```python
import glob

与类似模块对比:

模块 特点 适用场景
glob 简单通配符匹配 快速文件查找
os 底层文件操作 精确控制文件系统
pathlib 面向对象路径操作 现代Python项目
fnmatch 文件名匹配(不涉及路径) 纯字符串匹配

2. 基本通配符使用

2.1 星号(*)通配符

匹配任意长度字符(包括空字符):

# 查找所有.py文件
py_files = glob.glob('*.py')
print(py_files)  # 输出: ['script1.py', 'test.py', 'main.py']

# 查找data目录下所有.csv文件
csv_files = glob.glob('data/*.csv')

2.2 问号(?)通配符

匹配单个任意字符:

# 查找类似file1.txt, file2.txt等文件
files = glob.glob('file?.txt')

2.3 字符集([])通配符

匹配指定范围内的单个字符:

# 查找file1.txt到file5.txt
files = glob.glob('file[1-5].txt')

# 查找a.txt或b.txt
files = glob.glob('[ab].txt')

转义特殊字符

import glob
escaped = glob.escape('特殊*文件.txt')
files = glob.glob(escaped)

3. 递归文件搜索

Python 3.5+ 支持**模式:

# 递归查找所有子目录中的.py文件
all_py_files = glob.glob('**/*.py', recursive=True)

# 结合使用示例
config_files = glob.glob('config/**/*.json', recursive=True)

传统实现方式(Python 3.5之前)

import os
def find_files(pattern, path):
    result = []
    for root, _, _ in os.walk(path):
        for match in glob.glob(os.path.join(root, pattern)):
            result.append(match)
    return result

4. 路径名模式匹配

4.1 绝对路径匹配

abs_paths = glob.glob('/usr/local/*.sh')

4.2 相对路径匹配

rel_paths = glob.glob('../images/*.png')

4.3 多级目录模式

multi_level = glob.glob('src/*/tests/*.py')

4.4 排除特定文件

important_files = [f for f in glob.glob('*.docx') 
                  if not f.startswith('~$')]

5. glob与正则表达式对比

5.1 模式语法差异

模式 glob 正则表达式
任意字符 ? .
任意数量 * .*
字符集 [abc] [abc]
范围 [a-z] [a-z]
非匹配集 [!abc] [^abc]

5.2 转换示例

import re
from fnmatch import translate

glob_pattern = "data_[0-9].csv"
regex_pattern = translate(glob_pattern)
# 输出: 'data_[0-9]\\.csv\\Z(?ms)'

5.3 何时选择哪种方式

6. 实际应用案例

6.1 批量重命名文件

import os
import glob

for filename in glob.glob('photo_*.jpg'):
    new_name = filename.replace('photo_', 'vacation_')
    os.rename(filename, new_name)

6.2 多类型文件处理

supported_formats = ('*.jpg', '*.png', '*.gif')
image_files = []
for fmt in supported_formats:
    image_files.extend(glob.glob(fmt))

6.3 项目文件统计

def count_loc():
    total_lines = 0
    for py_file in glob.glob('**/*.py', recursive=True):
        with open(py_file) as f:
            total_lines += len(f.readlines())
    return total_lines

6.4 配置文件加载

import json
config = {}
for config_file in glob.glob('config/*.json'):
    with open(config_file) as f:
        config.update(json.load(f))

7. 性能优化建议

7.1 使用iglob处理大量文件

# 返回生成器而非列表,节省内存
large_file_iter = glob.iglob('big_data/**/*.csv', recursive=True)
for file_path in large_file_iter:
    process_file(file_path)

7.2 缩小搜索范围

# 不推荐 - 搜索范围太大
all_files = glob.glob('**/*', recursive=True)

# 推荐 - 精确限定目录层级
target_files = glob.glob('project/src/**/*.py', recursive=True)

7.3 缓存结果

from functools import lru_cache

@lru_cache(maxsize=128)
def get_cached_glob(pattern):
    return glob.glob(pattern)

7.4 并行处理(Python 3.8+)

import concurrent.futures

def process_file(file):
    # 文件处理逻辑
    pass

with concurrent.futures.ThreadPoolExecutor() as executor:
    files = glob.glob('large_dataset/*.csv')
    executor.map(process_file, files)

8. 常见问题解答

Q1: glob会匹配隐藏文件吗?

在Unix系统中,以点(.)开头的文件是隐藏文件。glob默认不匹配这类文件,除非模式明确包含点:

hidden_files = glob.glob('.*')

Q2: 如何实现不区分大小写的匹配?

glob本身不支持,但可以通过组合实现:

import os
case_insensitive = [f for f in os.listdir() 
                   if f.lower().endswith('.pdf')]

Q3: glob返回结果的顺序是怎样的?

返回顺序取决于文件系统实现,通常是无序的。需要排序可以:

sorted_files = sorted(glob.glob('*.txt'))

Q4: 如何处理路径中的特殊字符?

使用glob.escape进行转义:

safe_pattern = glob.escape('特殊*文件.txt') + '.txt'
files = glob.glob(safe_pattern)

Q5: Windows和Unix路径差异如何解决?

建议: 1. 使用原始字符串(r’path\pattern’) 2. 使用pathlib进行路径操作 3. 避免硬编码路径分隔符

9. 总结

glob模块作为Python标准库的一部分,提供了简洁高效的文件路径匹配方案。通过本文我们了解了:

  1. 基本通配符的使用方法和组合技巧
  2. 递归搜索的两种实现方式
  3. 与正则表达式的区别和适用场景
  4. 多个实际应用案例
  5. 性能优化的专业建议

对于现代Python项目,可以考虑结合pathlib使用:

from pathlib import Path
py_files = list(Path().rglob('*.py'))  # 递归查找

记住,glob虽然简单强大,但在处理超大型文件系统或需要复杂匹配时,可能需要考虑更专业的解决方案如find命令或专门的索引工具。

最佳实践建议: - 简单匹配优先使用glob - 复杂场景考虑pathlib+glob组合 - 注意跨平台路径处理 - 大量文件使用iglob节省内存 “`

推荐阅读:
  1. 检索、备份及编辑文件
  2. 怎么在PHP中使用glob方法遍历文件夹

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python glob

上一篇:python装饰器使用实例分析

下一篇:如何使用OpenCV和Python实现图片高斯模糊

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》