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

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

1. 为什么需要glob模块?

在日常开发中,我经常遇到需要批量处理文件的情况。比如上周帮朋友整理婚礼照片,几千张图片散落在不同文件夹里,手动筛选简直要命。这时候Python的glob模块就成了救命稻草。

与os.listdir()相比,glob最大的优势是支持通配符匹配。想象你有一堆日志文件,命名格式是"access_20230601.log",用os.listdir()只能获取全部文件列表,而glob可以直接用"access_2023*.log"这样的模式精准匹配。

更棒的是,glob支持递归查找。我最近做的项目需要分析服务器上多层嵌套的日志目录,一行glob.glob('logs/**/*.log', recursive=True)就搞定了所有文件定位,省去了手动递归的麻烦。

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的隐藏大招。配合recursive=True参数,可以穿透所有子目录。我整理电子书时这样用:

all_epubs = glob.glob('我的图书馆/**/*.epub', recursive=True)

这行代码会扫描"我的图书馆"下所有子文件夹,找出所有epub格式的电子书。注意Windows路径要用反斜杠,建议用原始字符串:r'C:\Users\*\Documents\*.docx'

3. 实战场景应用

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(days=7) 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}', recursive=True): # 根据分辨率分类 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的**/*.conf

5.2 配合shutil进行文件操作

我常用的文件备份套路:

import shutil import glob for src in glob.glob('重要文档/**/*.docx', recursive=True): 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(f'tests/**/{pattern}', recursive=True)) return sorted(list(set(testcases)))

这个方案自动识别三种主流命名规范的测试文件,去重后返回有序列表。团队反馈比之前硬编码路径的方式灵活多了。

http://www.jsqmd.com/news/1095769/

相关文章:

  • Steam成就管理终极指南:如何安全高效管理你的游戏成就
  • 视频编辑神器Topaz Video AI下载安装及使用手册:附官网安装包+图文版详细步骤
  • AI岗位需求分析05-薪资对决——2026年AI各岗位薪资全面对比,7个AI岗位薪资梯队揭密:你在哪一层?
  • MOOTDX:免费获取实时股票数据的终极解决方案
  • Cursor-AI模型选型与协作指南
  • 企业级文件上传漏洞深度解析:从原理到飞企互联FE平台实战复现
  • 『Ubuntu系统NVIDIA驱动安装:从GUI到CLI的3种实战路径解析』
  • 3步重塑Windows任务栏:用TranslucentTB打造透明美学桌面
  • GEO代理可以做全包托管业务吗
  • 光刻工艺深度解析:芯片上的纳米级雕刻到底是怎么做到的
  • Rimworld Mod进阶 图形篇 第一讲:活用GraphicData,打造视觉差异化Mod
  • 长安车机工具箱实战:从备份到破解,解锁第三方应用安装全流程
  • 企业级农产品预售平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 代数多重网格法:从黑盒求解器到工业应用的核心引擎
  • GitHub中文插件:3步打造你的专属中文GitHub开发环境
  • 收藏必备!小白程序员必学:大模型工程化新宠——Loop Engineering入门指南
  • 气体泄漏:不是“漏不漏”的问题,是“多久才发现”的问题
  • 【记录】「COCI 2015.11」SAVEZ
  • 全带宽多通道AI无线电平台-【凤凰】DBF16
  • 工业机器人搬运应用落地案例:汽车冷凝器芯体搬运
  • 超越证伪:贾子理论对波普尔科学划界标准的公理重构与认知范式迁移——基于TMM三层真理结构与KIO逆算子视角的批判性考察
  • 选收银系统时的关键注意事项和选择指南
  • 终极分屏游戏指南:如何用Nucleus Co-Op实现本地多人游戏
  • safeguard-web社区贡献指南:如何参与开源项目开发
  • 四层板分层差异化铜厚选型底层规范与基准方案
  • Windows防休眠终极指南:为什么你需要NoSleep这款轻量级神器?
  • Python大麦抢票脚本终极指南:如何用自动化技术提升300%成功率
  • 【学习笔记】推理加速三板斧:KV Cache、PagedAttention、Continuous Batching(11/35)
  • 性能测试实战:从需求分析到TPS精准计算与瓶颈定位
  • 从硬边界到软归属:模糊聚类 (Fuzzy Clustering) 的核心思想与实践