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 相关文章推荐
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Python正规则表达式学习指南
Aug 02 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
Python的Lambda函数用法详解
Sep 03 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 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
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python使用selenium实现批量文件下载
2019/03/11 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
政法学院毕业生求职信
2014/02/28 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
2015年技术员工作总结
2015/04/10 职场文书
公司人事任命通知
2015/04/20 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers