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

深入解析Python的glob.glob()函数:递归匹配文件与目录的实战技巧

1. glob.glob()函数基础入门当你第一次接触Python的文件操作时可能会被各种复杂的路径处理搞得晕头转向。这时候**glob.glob()**就像是一位贴心的文件管家它能帮你快速找到符合特定模式的文件路径。想象一下你有一个装满各种文档的文件夹现在需要找出所有PDF文件——手动翻找太费时而glob.glob()只需一行代码就能搞定。这个函数来自Python标准库中的glob模块使用前需要先导入import glob它的基本用法简单到令人惊喜txt_files glob.glob(*.txt) print(txt_files) # 输出当前目录下所有.txt文件我刚开始用这个函数时经常把它和os.listdir()搞混。后来发现它们最大的区别在于os.listdir()只是简单列出目录内容而glob.glob()支持强大的模式匹配。比如你想找所有以report开头、后跟两位数字的Excel文件用glob.glob(report[0-9][0-9].xlsx)就能精准匹配。2. 递归匹配的魔法参数真正让glob.glob()大放异彩的是它的递归查找能力。记得有次我需要整理一个包含数百个子目录的项目文档手动查找简直是一场噩梦。直到发现了双星号()这个秘密武器all_py_files glob.glob(**/*.py, recursiveTrue)这个简单的模式会像探照灯一样扫描当前目录及其所有子目录找出每个角落的Python文件。实测下来对于5层嵌套的目录结构查找速度依然很快。但要注意一个常见陷阱如果不设置recursiveTrue参数双星号就不会生效。我就曾因为这个疏忽浪费了半小时调试时间。正确的完整写法应该是# 正确写法 all_files glob.glob(**/*, recursiveTrue) # 错误写法不会递归 wrong_files glob.glob(**/*)递归查找还支持更精细的控制。比如只想查找特定深度的子目录# 查找一级子目录中的jpg文件 level1_jpg glob.glob(*/*.jpg, recursiveTrue) # 查找两级子目录中的csv文件 level2_csv glob.glob(*/*/*.csv, recursiveTrue)3. 高级通配符技巧通配符是glob.glob()的灵魂所在掌握它们能让你事半功倍。除了常见的星号(*)还有一些隐藏技巧值得了解问号(?)匹配特别适合处理固定长度的文件名。比如监控摄像头每天生成的图片文件# 匹配2023-01-01.jpg这类日期格式文件 daily_images glob.glob(2023-??-??.jpg)方括号[]匹配让我省去了很多正则表达式的麻烦。有次需要处理多个版本的日志文件# 匹配error_A.log到error_E.log version_logs glob.glob(error_[A-E].log)更厉害的是字符范围匹配比如找出所有测试用户的文档# 匹配user0.txt到user9.txt test_users glob.glob(user[0-9].txt)我常用的一个技巧是组合多个通配符# 匹配img1.jpg到img99.jpg但不包括img100.jpg double_digit_imgs glob.glob(img[0-9][0-9].jpg)4. 实战场景应用案例在实际项目中我积累了几个特别实用的glob.glob()应用模式。比如批量处理图片缩略图时from PIL import Image for img_path in glob.glob(static/images/**/*.jpg, recursiveTrue): with Image.open(img_path) as img: img.thumbnail((300, 300)) img.save(fthumbs/{img_path})另一个典型场景是日志分析。我们的服务器每天会产生数百个日志文件用glob可以轻松归类import pandas as pd # 收集所有5月份的error日志 error_logs [] for log_file in glob.glob(logs/2023-05-*/error_*.log): with open(log_file) as f: error_logs.extend(f.readlines()) # 分析错误频率 error_df pd.DataFrame({log: error_logs}) print(error_df[log].value_counts().head(10))处理多用户上传文件时这个技巧也很有用# 清理30天前的临时文件 import os import time expire_time time.time() - 30 * 24 * 3600 for temp_file in glob.glob(uploads/tmp/**/*, recursiveTrue): if os.path.getmtime(temp_file) expire_time: os.remove(temp_file)5. 性能优化与注意事项虽然glob.glob()很方便但在处理超大型目录时可能会遇到性能问题。经过多次测试我发现几个关键优化点首先尽量避免使用过于宽泛的模式。比如**/*这样的模式会强制扫描所有文件而*.csv就高效得多。有次我误用了**/*扫描整个用户目录程序卡了足足5分钟。其次合理使用root_dir参数可以减少路径拼接操作# 更高效的写法 docs glob.glob(*.pdf, root_dir/Users/me/Documents) # 等价于低效写法 docs [f/Users/me/Documents/{f} for f in glob.glob(/Users/me/Documents/*.pdf)]对于超大型文件系统可以考虑改用pathlib.Path.glob()因为它返回的是生成器而非列表内存占用更小from pathlib import Path # 适合处理大量文件 py_files Path(.).glob(**/*.py) for file in py_files: print(file)还有一个容易忽略的点是隐藏文件处理。默认情况下glob会忽略以点开头的文件如果需要包含它们# 包含隐藏文件 all_files glob.glob(.*, include_hiddenTrue) glob.glob(*, include_hiddenTrue)6. 与其它文件操作库的对比很多Python开发者会在os、pathlib和glob之间纠结。根据我的使用经验它们各有最佳适用场景**os.listdir()**最简单但功能也最基础。适合只需要列出文件名的情况import os all_files os.listdir() # 纯文件名列表无路径信息pathlib.Path更面向对象适合需要频繁操作路径的场景from pathlib import Path # 获取文件大小 py_file Path(script.py) print(py_file.stat().st_size)而**glob.glob()**在模式匹配方面无人能敌。特别是当需要组合多个匹配条件时# 找出所有测试用的CSV文件 test_files glob.glob(test_[0-9].csv) glob.glob(test_[0-9][0-9].csv)我常用的一个模式是先使用glob过滤文件再用pathlib处理路径from pathlib import Path for csv_file in glob.glob(data/**/*.csv, recursiveTrue): path Path(csv_file) print(f处理{path.stem}大小{path.stat().st_size}字节)7. 跨平台兼容性问题在Windows和Linux系统间移植代码时我发现了一些路径处理的坑。最典型的是反斜杠和正斜杠的问题在Windows上以下写法可能会出错# Windows下的危险写法 broken_files glob.glob(data\subdir\*.txt) # 反斜杠会被当作转义字符安全的跨平台写法应该是# 正确写法1使用正斜杠 safe_files glob.glob(data/subdir/*.txt) # 正确写法2使用raw字符串 safe_files glob.glob(rdata\subdir\*.txt) # Windows专用另一个陷阱是大小写敏感问题。Linux系统是大小写敏感的而Windows不是# 在Linux上可能找不到文件 linux_files glob.glob(*.JPG) # 找不到.jpg文件 # 解决方案使用字符类 case_insensitive glob.glob(*.[jJ][pP][gG])处理国际化文件名时也有讲究。有次遇到包含中文的文件名匹配问题最终发现需要显式编码# 处理中文文件名 chinese_files glob.glob(报告/*.pdf.encode(utf-8).decode(gbk))8. 调试技巧与常见错误即使是经验丰富的开发者使用glob时也会踩坑。我总结了几种常见错误及解决方法模式不匹配是最常见的问题。记得有次我写了*.txt却怎么也匹配不到文件最后发现目标文件扩展名其实是.TXT。解决方法是用*.[tT][xX][tT]。递归失效是另一个高频错误。确保同时满足两个条件模式中包含**设置了recursiveTrue隐藏文件遗漏也经常发生。默认情况下glob会忽略以点开头的文件记得设置include_hiddenTrue。我常用的调试方法是先打印出当前目录结构import os print(os.listdir(.)) # 查看实际存在的文件名对于复杂模式建议分步测试# 先测试基础模式 print(glob.glob(*.py)) # 再添加递归 print(glob.glob(**/*.py, recursiveTrue))当glob返回空列表时可以尝试以下排查步骤确认当前工作目录是否正确os.getcwd()检查路径拼写是否正确验证文件确实存在检查是否有权限访问该目录

相关文章:

深入解析Python的glob.glob()函数:递归匹配文件与目录的实战技巧

1. glob.glob()函数基础入门 当你第一次接触Python的文件操作时,可能会被各种复杂的路径处理搞得晕头转向。这时候**glob.glob()**就像是一位贴心的文件管家,它能帮你快速找到符合特定模式的文件路径。想象一下,你有一个装满各种文档的文件夹…...

Wan2.2-I2V-A14B批量处理架构设计:应对高并发生成请求

Wan2.2-I2V-A14B批量处理架构设计:应对高并发生成请求 1. 引言:视频生成的高并发挑战 电商大促期间,某直播平台需要为上万件商品自动生成展示视频。传统单机处理模式下,平均每视频生成耗时2分钟,高峰期积压任务超过5…...

别再死记硬背参数了!OpenCV solvePnP函数在ArUco/ChArUco实战中的保姆级配置指南

别再死记硬背参数了!OpenCV solvePnP函数在ArUco/ChArUco实战中的保姆级配置指南 刚接触计算机视觉定位时,面对solvePnP函数里那些晦涩的参数选项,你是否也曾感到无从下手?每次调用时都机械地复制粘贴默认参数,却不知道…...

从Turbo C到VSCode:手把手教你修复一个90年代风格的C语言哈夫曼编码程序

从Turbo C到VSCode:手把手教你修复一个90年代风格的C语言哈夫曼编码程序 在某个深夜整理旧硬盘时,我意外发现了一个尘封已久的文件夹——"GameCode155"。里面躺着一个用Turbo C编写的哈夫曼编码程序,文件创建日期显示是1998年。这份…...

2026年,如何挑选服务最优的二极管供应商?这份指南给你答案

在电子制造业,一颗小小的二极管,常常是决定产品成败的关键。你是否也遇到过这样的困境:产线急等物料,供应商却迟迟无法交货;产品批量上市后,却因二极管批次性质量问题导致大规模返工;面对复杂的…...

特斯拉Dojo v4、苹果Vision Pro 2、华为昇腾Atlas-X三巨头技术路线图对比(基于2026奇点大会未删节演讲PPT第47–89页)

第一章:2026奇点智能技术大会:3D视觉大模型 2026奇点智能技术大会(https://ml-summit.org) 核心突破:多模态几何感知架构 本届大会首次发布开源3D视觉大模型 VisionGeo-3B,该模型在ScanNet v2与ARKitScenes基准上实现92.7%的实…...

DeEAR镜像安全合规说明:符合GDPR语音数据本地处理要求,无外传风险

DeEAR镜像安全合规说明:符合GDPR语音数据本地处理要求,无外传风险 1. 项目概述 DeEAR(Deep Emotional Expressiveness Recognition)是一款基于wav2vec2的深度语音情感表达分析系统,专注于识别语音中的情感特征。该系…...

飞将远程办公系统:让分支组网 + 远程办公,一步到位!

还在为异地分支互联、员工远程办公的网络问题头疼吗? 来看看我们的飞将远程办公系统,简单好懂,直接解决你的痛点 一张图看懂我们的网络架构 👇 我们的核心逻辑超简单:一个「飞将组网中枢」,打通所有办公场…...

系统救援瑞士军刀:Rescuezilla让你的数据安全无忧

系统救援瑞士军刀:Rescuezilla让你的数据安全无忧 【免费下载链接】rescuezilla The Swiss Army Knife of System Recovery 项目地址: https://gitcode.com/gh_mirrors/re/rescuezilla 你是否曾因电脑突然蓝屏、系统崩溃或硬盘故障而惊慌失措?面对…...

储能系统参与调峰调频联合优化模型解析

MATLAB代码:储能参与调峰调频联合优化模型 关键词:储能 调频 调峰 充放电优化 联合运行 仿真平台:MATLABCVX 平台 主要内容:代码主要做的是考虑储能同时参与调峰以及调频的联合调度模型,现有代码往往仅关注储能在调峰…...

生成式AI限流不是加个@RateLimit就完事:深度拆解OpenAI/Anthropic/Mistral官方SDK熔断策略差异(附兼容性迁移checklist)

第一章:生成式AI应用限流熔断机制 2026奇点智能技术大会(https://ml-summit.org) 在高并发场景下,生成式AI服务(如大语言模型API)极易因突发流量、长尾请求或模型推理资源争抢而出现响应延迟激增、OOM崩溃或服务质量不可控等问题…...

从数据文件到工作区变量:深入理解Matlab的load函数底层逻辑

从数据文件到工作区变量:深入理解Matlab的load函数底层逻辑 在Matlab的日常使用中,load函数可能是最频繁接触却又最容易被忽视的基础工具之一。大多数用户满足于知道它能将.mat文件中的变量加载到工作区,或者将ASCII文件读取为双精度数组。但…...

Bebas Neue:几何美学的开源字体解决方案与设计哲学解析

Bebas Neue:几何美学的开源字体解决方案与设计哲学解析 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 在数字设计的世界中,字体不仅仅是文字的载体,更是视觉语言的基石。Beba…...

告别环境配置噩梦:用Docker一键搞定RK3588 Linux SDK编译环境(附正点原子镜像)

告别环境配置噩梦:用Docker一键搞定RK3588 Linux SDK编译环境 嵌入式开发最让人头疼的往往不是代码本身,而是环境搭建。记得我第一次接触RK3588开发板时,整整两天时间都耗在Ubuntu环境配置上——从交叉编译工具链版本冲突到库依赖缺失&#x…...

别再死记硬背了!用Multisim仿真5分钟搞懂变压器同名端判断(附实验文件)

5分钟玩转Multisim:用仿真实验破解变压器同名端判断难题 刚接触变压器同名端概念时,你是否也被那些抽象的"正负相位"、"耦合极性"搞得晕头转向?传统教材里密密麻麻的公式推导和文字描述,总让人感觉隔着一层迷…...

CCSP在职通关实录:从零到一的知识体系构建与应试策略

1. CCSP认证的核心价值与适用人群 作为云安全领域的黄金标准,CCSP(Certified Cloud Security Professional)认证正在成为企业评估云安全人才的重要标尺。我三年前第一次接触这个认证时,发现它完美融合了CISSP的安全框架和云安全实…...

物联网LoRa系列-33:LoRaWAN智能水表数据采集实战:从脉冲信号到云端数据的完整链路解析

1. LoRaWAN智能水表系统架构解析 我第一次接触LoRaWAN智能水表项目时,最头疼的就是理清整个系统的工作流程。这个系统就像人体的血液循环网络,水表是末梢毛细血管,LoRa网关是静脉血管,云端服务器则是心脏中枢。让我用实际项目经验…...

从山大地纬笔试看Java与数据库核心考点解析

1. 从笔试真题看Java面向对象核心考点 最近帮朋友复盘山大地纬的Java笔试题目,发现虽然题目难度不大,但确实能精准考察面向对象的基本功。就拿这道题来说:"下面概念中,不属于面向对象方法的是?"选项里藏着&q…...

GetQzonehistory:简单三步备份QQ空间历史说说的终极指南 [特殊字符]

GetQzonehistory:简单三步备份QQ空间历史说说的终极指南 🚀 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 想要永久保存你在QQ空间的青春回忆吗?Get…...

避坑指南:Gromacs模拟后处理之轨迹矫正、自由能计算与高清渲染实战

Gromacs后处理实战:从轨迹矫正到高清渲染的进阶技巧 在分子动力学模拟的世界里,跑完模拟只是万里长征的第一步。真正考验研究者功力的,往往在于如何从海量数据中提取有价值的信息,并将其转化为直观、专业的可视化结果。本文将聚焦…...

【Python】pandas Week 8 - 1:环境搭建与基础概念

一、学习目标搭建Python 环境理解 DataFrame 和 Series学会读取和查看数据二、Pandas vs SQL 语法对照SQL概念pandas对应学习重点SELECT * FROM tabledf 或 df.head()查看数据SELECT col1, col2df[[col1, col2]]选择列WHEREdf[df[col] > 100]条件筛选GROUP BYdf.groupby(col…...

互联网大厂Java求职面试实战:Spring Boot与微服务架构解析

互联网大厂Java求职面试实战:Spring Boot与微服务架构解析 在一个互联网医疗场景下,一位严肃的面试官正对求职者谢飞机进行Java相关技术的面试。谢飞机表现各异,既有亮点也有不足,本文详细还原了三轮面试问答,帮助读者…...

无需外接设备,利用NoMachine实现Ubuntu远程桌面控制

1. 为什么需要远程控制Ubuntu桌面? 很多开发者都遇到过这样的场景:手头只有一台Windows笔记本,但需要调试Ubuntu服务器或开发板。传统做法要么接显示器键盘鼠标,要么用SSH命令行操作。前者需要额外硬件,后者又不够直观…...

Retrieval-based-Voice-Conversion-WebUI:10分钟训练专业级AI音色的终极指南

Retrieval-based-Voice-Conversion-WebUI&#xff1a;10分钟训练专业级AI音色的终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieva…...

10分钟极速配置:XiaoMusic智能音乐中心深度评测与实战指南

10分钟极速配置&#xff1a;XiaoMusic智能音乐中心深度评测与实战指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为小爱音箱无法播放心仪歌曲而困扰吗&…...

【实践】零外设玩转树莓派:SSH+VNC实现远程桌面与开发环境搭建

1. 零外设玩转树莓派的核心思路 第一次接触树莓派时&#xff0c;我也被"必须连接显示器"这个传统认知给限制住了。直到有一次出差&#xff0c;手边只有笔记本电脑&#xff0c;却急需调试树莓派上的传感器项目&#xff0c;这才发现原来完全可以通过SSHVNC的组合实现全…...

Bazzite 41深度解析:7大特性打造终极游戏Linux系统

Bazzite 41深度解析&#xff1a;7大特性打造终极游戏Linux系统 【免费下载链接】bazzite Bazzite makes gaming and everyday use smoother and simpler across desktop PCs, handhelds, tablets, and home theater PCs. 项目地址: https://gitcode.com/gh_mirrors/ba/bazzit…...

别再手动调时间了!用GPS的PPS信号自动校准你的STM32 RTC(附GPRMC解析避坑指南)

基于GPS PPS信号的STM32 RTC高精度自动校准实战指南 在野外环境部署的物联网传感器节点中&#xff0c;时间同步问题往往成为数据有效性的致命短板。我曾亲历过一个农业监测项目——由于RTC时钟漂移导致的环境数据时间戳错乱&#xff0c;最终让两周的土壤湿度监测数据完全失去科…...

告别龟速下载:用Python工具获取百度网盘直连下载地址

告别龟速下载&#xff1a;用Python工具获取百度网盘直连下载地址 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否也曾被百度网盘的下载速度折磨得抓狂&#xff1f;几十K…...

保姆级教程:在i.MX6ULL开发板上配置设备树,用RTS-GPIO驱动RS485温湿度传感器

i.MX6ULL开发板实战&#xff1a;设备树配置与RS485温湿度传感器驱动指南 在工业自动化、环境监测等领域&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势成为常见通信方案。本文将手把手指导您在NXP i.MX6ULL开发板上完成设备树配置&#xff0c;实现通过RTS-GPIO控制R…...