Python glob模块详解:轻松实现文件查找与匹配

张开发
2026/4/14 20:28:55 15 分钟阅读

分享文章

Python glob模块详解:轻松实现文件查找与匹配
Python的glob模块是标准库的一部分用于根据Unix shell风格的通配符规则查找符合特定模式的文件路径名。与手动遍历目录相比使用glob可以大大简化文件查找操作。二、基本使用方法1. 导入模块import glob2. 基本通配符匹配glob模块支持三种主要通配符*匹配任意多个字符包括零个字符?匹配单个字符[]匹配指定范围内的字符import glob # 查找当前目录下所有.txt文件 txt_files glob.glob(*.txt) print(所有txt文件:, txt_files) # 查找所有以data开头的文件 data_files glob.glob(data*) print(data开头的文件:, data_files) # 使用问号匹配单个字符 # 匹配file1.txt, file2.txt等但不匹配file10.txt single_char_files glob.glob(file?.txt) print(单个数字编号的文件:, single_char_files) # 使用字符范围匹配 # 匹配file1.txt到file5.txt range_files glob.glob(file[1-5].txt) print(1-5编号的文件:, range_files)三、高级查找技巧1. 递归查找子目录使用**配合recursiveTrue参数可以递归查找所有子目录import glob # 递归查找所有子目录中的py文件 all_py_files glob.glob(**/*.py, recursiveTrue) print(所有Python文件:, all_py_files) # 递归查找特定类型的文件 all_images glob.glob(**/*.jpg, recursiveTrue) \ glob.glob(**/*.png, recursiveTrue) \ glob.glob(**/*.gif, recursiveTrue) print(所有图片文件:, all_images)2. 使用iglob迭代器处理大量文件当处理大量文件时使用iglob可以节省内存import glob # iglob返回一个迭代器而不是列表 for file_path in glob.iglob(**/*.log, recursiveTrue): # 可以逐行处理大文件而不占用太多内存 with open(file_path, r) as f: # 处理文件内容 print(f处理文件: {file_path})3. 多模式组合查找import glob # 查找多种扩展名的文件 extensions [*.txt, *.csv, *.json] all_data_files [] for ext in extensions: all_data_files.extend(glob.glob(fdata/**/{ext}, recursiveTrue)) print(所有数据文件:, all_data_files) # 或者使用更简洁的方式 all_files glob.glob(data/**/*.txt) \ glob.glob(data/**/*.csv) \ glob.glob(data/**/*.json)四、实际应用案例1. 批量处理图片文件import glob from PIL import Image import os def resize_images(input_pattern, output_dir, size(800, 600)): 批量调整图片大小 if not os.path.exists(output_dir): os.makedirs(output_dir) for img_path in glob.glob(input_pattern, recursiveTrue): try: with Image.open(img_path) as img: img_resized img.resize(size, Image.Resampling.LANCZOS) # 构造输出路径 filename os.path.basename(img_path) output_path os.path.join(output_dir, filename) img_resized.save(output_path) print(f已处理: {filename} - {output_path}) except Exception as e: print(f处理{img_path}时出错: {e}) # 使用示例 resize_images(photos/**/*.jpg, resized_photos)2. 日志文件分析import glob import re from datetime import datetime from collections import defaultdict def analyze_logs(log_pattern): 分析日志文件中的错误 error_pattern re.compile(rERROR.*) date_pattern re.compile(r\d{4}-\d{2}-\d{2}) errors_by_date defaultdict(int) for log_file in glob.glob(log_pattern, recursiveTrue): with open(log_file, r, encodingutf-8) as f: for line in f: if error_pattern.search(line): date_match date_pattern.search(line) if date_match: date date_match.group() errors_by_date[date] 1 # 输出统计结果 print(错误统计:) for date, count in sorted(errors_by_date.items()): print(f{date}: {count}个错误) return errors_by_date # 使用示例 errors analyze_logs(logs/**/*.log)3. 项目文件整理import glob import shutil import os def organize_project_files(project_root): 整理项目文件到分类目录 # 定义文件类型和目录的映射 file_categories { images: [*.jpg, *.png, *.gif, *.bmp], documents: [*.pdf, *.docx, *.txt], code: [*.py, *.js, *.html, *.css], data: [*.csv, *.json, *.xml] } for category, patterns in file_categories.items(): category_dir os.path.join(project_root, category) if not os.path.exists(category_dir): os.makedirs(category_dir) for pattern in patterns: for file_path in glob.glob(os.path.join(project_root, pattern)): if not os.path.isdir(file_path): try: shutil.move(file_path, category_dir) print(f已移动: {os.path.basename(file_path)} - {category}) except Exception as e: print(f移动{file_path}失败: {e}) # 使用示例 organize_project_files(my_project)五、注意事项与最佳实践1. 路径处理建议import glob import os # 正确处理路径分隔符 pattern os.path.join(data, *.csv) # 跨平台兼容 files glob.glob(pattern) # 获取绝对路径 absolute_files [os.path.abspath(f) for f in glob.glob(*.py)]2. 错误处理import glob def safe_glob(pattern, defaultNone): 安全的glob函数避免异常影响主程序 try: return glob.glob(pattern, recursiveTrue) except (OSError, PermissionError) as e: print(f访问文件时出错: {e}) return default or [] # 使用安全版本 files safe_glob(important/**/*.data)3. 性能优化对于大目录考虑使用iglob迭代器避免过度使用通配符**尽量明确路径考虑使用生成器表达式处理结果import glob import os # 高效处理大量文件 def process_large_directory(root_dir, extension*.txt): pattern os.path.join(root_dir, **, extension) for filepath in glob.iglob(pattern, recursiveTrue): # 使用生成器逐步处理 yield process_file(filepath) # 使用生成器 for result in process_large_directory(big_data_dir): print(result)六、glob vs os.listdir vs pathlibimport glob import os from pathlib import Path # 三种方式的对比 directory . # 1. 使用glob glob_files glob.glob(*.py) # 2. 使用os.listdir 过滤 listdir_files [f for f in os.listdir(directory) if f.endswith(.py)] # 3. 使用pathlib (Python 3.4) pathlib_files list(Path(directory).glob(*.py)) print(glob结果:, glob_files) print(listdir结果:, listdir_files) print(pathlib结果:, pathlib_files)选择建议glob适合简单的模式匹配语法简洁os.listdir需要更复杂的过滤逻辑时使用pathlib面向对象方式功能强大代码清晰总结Python的glob模块提供了强大而简洁的文件查找功能。通过掌握通配符的使用技巧结合递归查找和多模式匹配你可以轻松应对各种文件查找需求。在实际项目中合理使用glob模块可以显著提高代码的可读性和执行效率。记住glob模块只是文件处理工具链中的一环结合os、shutil、pathlib等模块你可以构建出更加强大和健壮的文件处理系统。实践是最好的学习方式建议读者在自己的项目中尝试使用glob模块并根据具体需求调整和优化查找模式。随着使用经验的积累你将能够更加熟练地运用这个强大的工具。

更多文章