您好,登录后才能下订单哦!
# 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 | 文件名匹配(不涉及路径) | 纯字符串匹配 |
匹配任意长度字符(包括空字符):
# 查找所有.py文件
py_files = glob.glob('*.py')
print(py_files) # 输出: ['script1.py', 'test.py', 'main.py']
# 查找data目录下所有.csv文件
csv_files = glob.glob('data/*.csv')
匹配单个任意字符:
# 查找类似file1.txt, file2.txt等文件
files = glob.glob('file?.txt')
匹配指定范围内的单个字符:
# 查找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)
Python 3.5+ 支持**模式:
# 递归查找所有子目录中的.py文件
all_py_files = glob.glob('**/*.py', recursive=True)
# 结合使用示例
config_files = glob.glob('config/**/*.json', recursive=True)
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
abs_paths = glob.glob('/usr/local/*.sh')
rel_paths = glob.glob('../images/*.png')
multi_level = glob.glob('src/*/tests/*.py')
important_files = [f for f in glob.glob('*.docx')
if not f.startswith('~$')]
模式 | glob | 正则表达式 |
---|---|---|
任意字符 | ? | . |
任意数量 | * | .* |
字符集 | [abc] | [abc] |
范围 | [a-z] | [a-z] |
非匹配集 | [!abc] | [^abc] |
import re
from fnmatch import translate
glob_pattern = "data_[0-9].csv"
regex_pattern = translate(glob_pattern)
# 输出: 'data_[0-9]\\.csv\\Z(?ms)'
使用glob当:
使用正则表达式当:
import os
import glob
for filename in glob.glob('photo_*.jpg'):
new_name = filename.replace('photo_', 'vacation_')
os.rename(filename, new_name)
supported_formats = ('*.jpg', '*.png', '*.gif')
image_files = []
for fmt in supported_formats:
image_files.extend(glob.glob(fmt))
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
import json
config = {}
for config_file in glob.glob('config/*.json'):
with open(config_file) as f:
config.update(json.load(f))
# 返回生成器而非列表,节省内存
large_file_iter = glob.iglob('big_data/**/*.csv', recursive=True)
for file_path in large_file_iter:
process_file(file_path)
# 不推荐 - 搜索范围太大
all_files = glob.glob('**/*', recursive=True)
# 推荐 - 精确限定目录层级
target_files = glob.glob('project/src/**/*.py', recursive=True)
from functools import lru_cache
@lru_cache(maxsize=128)
def get_cached_glob(pattern):
return glob.glob(pattern)
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)
在Unix系统中,以点(.)开头的文件是隐藏文件。glob默认不匹配这类文件,除非模式明确包含点:
hidden_files = glob.glob('.*')
glob本身不支持,但可以通过组合实现:
import os
case_insensitive = [f for f in os.listdir()
if f.lower().endswith('.pdf')]
返回顺序取决于文件系统实现,通常是无序的。需要排序可以:
sorted_files = sorted(glob.glob('*.txt'))
使用glob.escape进行转义:
safe_pattern = glob.escape('特殊*文件.txt') + '.txt'
files = glob.glob(safe_pattern)
建议: 1. 使用原始字符串(r’path\pattern’) 2. 使用pathlib进行路径操作 3. 避免硬编码路径分隔符
glob模块作为Python标准库的一部分,提供了简洁高效的文件路径匹配方案。通过本文我们了解了:
对于现代Python项目,可以考虑结合pathlib使用:
from pathlib import Path
py_files = list(Path().rglob('*.py')) # 递归查找
记住,glob虽然简单强大,但在处理超大型文件系统或需要复杂匹配时,可能需要考虑更专业的解决方案如find命令或专门的索引工具。
最佳实践建议: - 简单匹配优先使用glob - 复杂场景考虑pathlib+glob组合 - 注意跨平台路径处理 - 大量文件使用iglob节省内存 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。