尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【Python】用glob模块实现文件批量筛选与路径模式匹配
📅 发布时间:2026/6/30 12:00:32

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)))

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

相关新闻

  • AI岗位需求分析05-薪资对决——2026年AI各岗位薪资全面对比,7个AI岗位薪资梯队揭密:你在哪一层?
  • GEO代理可以做全包托管业务吗
  • 3步重塑Windows任务栏:用TranslucentTB打造透明美学桌面

最新新闻

  • 从仿真到实战:基于Multisim的数字钟设计与调试全流程解析
  • MPC5643L/SPC56EL评估板硬件设计解析:电源、时钟与启动配置实战
  • Viterbi算法:从最短路径到序列解码的实战指南
  • 【西安工商学院本科毕业论文】基于Web的演出售票可视化系统设计与实现
  • Playwright与MSW集成:构建稳定高效的前端E2E测试环境
  • DINOv1:无标签自蒸馏如何解锁ViT的视觉语义新特性

日新闻

  • 【计算机毕业设计案例】基于 Spring Boot+Vue 的电影售票系统设计与实现 前后端分离架构下影院在线购票管理平台(程序+文档+讲解+定制)
  • 到底 TMD 用哪个: npm, pnpm, Yarn, Bun, Deno? 傻瓜, 当然用 npm 啦
  • Google限制Meta使用Gemini模型 凸显AI授权竞争白热化

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号