Python 如何查找特定类型文件


Posted in Python onAugust 17, 2020

写在之前

今天的文章是介绍如何用 Python 去定位特定类型的文件,会讲到用字符串匹配文件名定位特定文件以及顺带介绍一下遍历目录树的函数,通过今天的这一部分以及之前文章讲到的文件获取属性的操作,可以做很多有意思的事情。

定位特定文件

定位特定的文件,可以使用 fnmatch 以及 glob 这两个标准库,我们下面来分别看一下。

1. 使用 fnmatch 标准库

一般的话我们想要查找特定类型的文件,可以通过字符串的前缀匹配和后缀匹配来查找,具体实例如下所示:

>>> import os
>>> [txt for txt in os.listdir('.') if txt.endswith('.txt')]
['b.txt', 'a.txt']

其实大部分的情况下这种用字符串匹配的方法来查找文件就足够可以满足需要,如果有些情况下需要更加灵活一点的字符串匹配,就可以使用 fnmatch 库,这是一个专门用来进行文件名匹配的库,支持使用通配符来进行文字匹配(比如'*','?'等)。

fnmatch 这个库很简单,只有 4 个函数:fnmatch,fnmatchcase,filter,translate:

  • fnmatch:判断文件名是否符合特定的模式;
  • fnmatchcase:判断文件名是否符合特定的模式(不区分大小写);
  • filter:返回输入列表中,符合特定模式的文件名列表;
  • translate:将通配符模式转换成正则表达式。

上面 4 个最常用是它的同名函数 fnmatch ,我的当前目录下有 4 个文件,分别是:a.txt,b.txt,c.py,test.py,下面我就用 fnmatch 函数来对当前目录下的这 4 个文件进行匹配性测试,具体请看下面代码:

>>> import os
>>> import fnmatch
>>> os.listdir('.')
['test.py', 'c.py', 'b.txt', 'a.txt']
>>> [txt for txt in os.listdir('.') if fnmatch.fnmatch(txt, '*.txt')]
['b.txt', 'a.txt']
>>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[a-c]*')]
['c.py', 'b.txt', 'a.txt']
>>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[!a-c]*')]
['test.py']

fnmatchcase 函数与 fnmatch 函数几乎一样,只是在匹配的时候会忽略大小写字母;filter 函数与 fnmatch 比较类似,区别在于fnmatch 一次只对一个文件名匹配,而 filter 一次可以对多个文件名进行匹配判断,下面我们就再来看一下 filter 的用法:

>>> import os
>>> import fnmatch
>>> file = os.listdir('.')
>>> file
['test.py', 'c.py', 'b.txt', 'a.txt']
>>> fnmatch.filter(file, '[a-c]*')
['c.py', 'b.txt', 'a.txt']
>>> fnmatch.filter(file, '[!a-c]*')
['test.py']

2.使用 glob 定位

我们在上面介绍的获取特定类型的文件列表,首先是通过 os.listdir 获取全部的文件列表,然后通过字符串匹配或者使用 fnmatch 进行文件名模式匹配来定位,习惯了 Python 的简洁优雅,这多出来的一步总觉得哪里怪怪的,好在我现在知道了 glob。

glob 的作用相当于 os.listdir + fnmatch 的组合,使用 glob 以后,就不需要用 os.listdir 获取文件列表,直接通过模式匹配就可以解决了,具体操作如下所示:

>>> import glob
>>> glob.glob('*.txt')
['b.txt', 'a.txt']
>>> glob.glob('[a-c]*')
['c.py', 'b.txt', 'a.txt']
>>> glob.glob('[!a-c]*')
['test.py']

可以看到,Python 真的非常的灵活,光是定位目录下特定的文件类型我就已经介绍了 3 种方式,一般情况下就用字符串匹配就可以解决,如果需要更加灵活一点的的,可以使用 fnmatch 和 glob。

遍历目录树

再上一节中我们都是查找某个目录下的文件然后通过匹配去定位自己需要的文件类型。但是在实际的应用过程中我们更可能遇到的是某个目录及其子目录下的所有文件。比如查找某个目录及其子目录下所有的 txt 文件等等,对于这类的需求,我们可以使用 os 模块下的「walk」函数。walk 函数遍历某个目录及其子目录,对于每一个目录,walk 返回一个三元组,依次是「当前目录」,「当前目录下的子目录」,「当前目录下的文件列表」。

下面我们来演示一下 os.walk 函数的用法,做一个小的练习,来遍历一下 /root/rocky0429 目录及其子目录下的所有 txt 和 图片文件:

import os
import fnmatch

search = ['*.txt', '*.jpg', '*.jpeg']
res = []

for root, dirnames, filenames in os.walk(os.path.expanduser('~/rocky0429')):
  for extension in search:
    for filename in fnmatch.filter(filenames, extension):
      res.append(os.path.join(root,filename))

    print(res)

以上就是Python 如何查找特定类型文件的详细内容,更多关于python 查找文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python类装饰器用法实例
Jun 04 Python
python检查序列seq是否含有aset中项的方法
Jun 30 Python
Python脚本实现自动发带图的微博
Apr 27 Python
python编写分类决策树的代码
Dec 21 Python
Python lambda函数基本用法实例分析
Mar 16 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
python-numpy-指数分布实例详解
Dec 07 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python代码实现图书管理系统
Nov 30 Python
基于PyQt5制作一个群发邮件工具
Apr 08 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 #Python
无需压缩软件,用python帮你操作压缩包
Aug 17 #Python
用Python制作mini翻译器的实现示例
Aug 17 #Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 #Python
pandas apply多线程实现代码
Aug 17 #Python
简述python Scrapy框架
Aug 17 #Python
python使用多线程查询数据库的实现示例
Aug 17 #Python
You might like
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
实现vuex原理的示例
2020/10/21 Javascript
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
运动会100米解说词
2014/01/23 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python