【Python】用glob模块实现文件批量筛选与路径模式匹配

📅 2026/6/30 11:54:12
【Python】用glob模块实现文件批量筛选与路径模式匹配
1. 为什么需要glob模块在日常开发中我经常遇到需要批量处理文件的情况。比如上周帮朋友整理婚礼照片几千张图片散落在不同文件夹里手动筛选简直要命。这时候Python的glob模块就成了救命稻草。与os.listdir()相比glob最大的优势是支持通配符匹配。想象你有一堆日志文件命名格式是access_20230601.log用os.listdir()只能获取全部文件列表而glob可以直接用access_2023*.log这样的模式精准匹配。更棒的是glob支持递归查找。我最近做的项目需要分析服务器上多层嵌套的日志目录一行glob.glob(logs/**/*.log, recursiveTrue)就搞定了所有文件定位省去了手动递归的麻烦。2. glob核心用法详解2.1 基础通配符三剑客glob模块最常用的三个通配符我习惯叫它们三剑客*星号匹配任意长度字符。比如*.jpg匹配所有jpg图片?问号匹配单个字符。photo?.jpg可以匹配photo1.jpg但匹配不了photo10.jpg[]中括号匹配指定范围。[0-9].txt匹配0.txt到9.txt实测一个有趣的用法report_[0-9][0-9].docx可以精准匹配类似report_01.docx这样的双数字编号文件比正则表达式简单多了。2.2 递归查找的黑科技**双星号是glob的隐藏大招。配合recursiveTrue参数可以穿透所有子目录。我整理电子书时这样用all_epubs glob.glob(我的图书馆/**/*.epub, recursiveTrue)这行代码会扫描我的图书馆下所有子文件夹找出所有epub格式的电子书。注意Windows路径要用反斜杠建议用原始字符串rC:\Users\*\Documents\*.docx3. 实战场景应用3.1 日志文件归档上周帮客户写了个日志清理脚本需求是保留最近7天的日志。我是这样实现的import glob import os from datetime import datetime, timedelta log_files glob.glob(/var/log/app/*.log) cutoff_date datetime.now() - timedelta(days7) for log in log_files: file_date datetime.fromtimestamp(os.path.getmtime(log)) if file_date cutoff_date: os.remove(log) print(f已删除过期日志: {log})3.2 图片批量处理做自媒体的小伙伴经常要处理大量图片。这是我的素材分类脚本核心代码image_types [*.jpg, *.png, *.gif] for ext in image_types: for img in glob.glob(f原始素材/**/{ext}, recursiveTrue): # 根据分辨率分类 if is_high_res(img): shutil.move(img, 高清图库) else: shutil.move(img, 普通图库)4. 高级技巧与避坑指南4.1 匹配中文文件名很多新手会遇到中文路径问题。我的经验是一定要处理编码path 文档/*.docx encoded_path path.encode(utf-8).decode(gbk) # Windows系统需要 files glob.glob(encoded_path)4.2 性能优化建议处理超大量文件时我发现改用iglob可以提升性能# 传统方式一次性加载所有结果 files glob.glob(大数据集/**/*.csv) # 改进方式迭代器懒加载 for file in glob.iglob(大数据集/**/*.csv): process_file(file)4.3 常见问题排查最近帮同事解决的一个典型问题模式匹配失效。原因是他们用了glob.glob(*.TXT)但在Linux系统上文件名是区分大小写的。解决方案# 不区分大小写的匹配方案 files [f for f in glob.glob(*) if f.lower().endswith(.txt)]5. 与其他模块的配合5.1 结合pathlib使用Python3.4推荐用pathlib的glob方法代码更优雅from pathlib import Path # 查找所有配置文件 config_files Path(/etc).rglob(*.conf) # 相当于glob的**/*.conf5.2 配合shutil进行文件操作我常用的文件备份套路import shutil import glob for src in glob.glob(重要文档/**/*.docx, recursiveTrue): dst f备份/{os.path.basename(src)} shutil.copy2(src, dst)6. 实际项目经验分享去年开发自动化测试框架时我设计了一个智能用例发现机制def discover_testcases(): testcases [] for pattern in [test_*.py, *_test.py, *_spec.py]: testcases.extend(glob.glob(ftests/**/{pattern}, recursiveTrue)) return sorted(list(set(testcases)))这个方案自动识别三种主流命名规范的测试文件去重后返回有序列表。团队反馈比之前硬编码路径的方式灵活多了。