Python 如何查找特定类型文件
写在之前
今天的文章是介绍如何用Python去定位特定类型的文件,会讲到用字符串匹配文件名定位特定文件以及顺带介绍一下遍历目录树的函数,通过今天的这一部分以及之前文章讲到的文件获取属性的操作,可以做很多有意思的事情。
定位特定文件
定位特定的文件,可以使用fnmatch以及glob这两个标准库,我们下面来分别看一下。
1.使用fnmatch标准库
一般的话我们想要查找特定类型的文件,可以通过字符串的前缀匹配和后缀匹配来查找,具体实例如下所示:
>>>importos >>>[txtfortxtinos.listdir('.')iftxt.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个文件进行匹配性测试,具体请看下面代码:
>>>importos >>>importfnmatch >>>os.listdir('.') ['test.py','c.py','b.txt','a.txt'] >>>[txtfortxtinos.listdir('.')iffnmatch.fnmatch(txt,'*.txt')] ['b.txt','a.txt'] >>>[fileforfileinos.listdir('.')iffnmatch.fnmatch(file,'[a-c]*')] ['c.py','b.txt','a.txt'] >>>[fileforfileinos.listdir('.')iffnmatch.fnmatch(file,'[!a-c]*')] ['test.py']
fnmatchcase函数与fnmatch函数几乎一样,只是在匹配的时候会忽略大小写字母;filter函数与fnmatch比较类似,区别在于fnmatch一次只对一个文件名匹配,而filter一次可以对多个文件名进行匹配判断,下面我们就再来看一下filter的用法:
>>>importos >>>importfnmatch >>>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获取文件列表,直接通过模式匹配就可以解决了,具体操作如下所示:
>>>importglob >>>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和图片文件:
importos importfnmatch search=['*.txt','*.jpg','*.jpeg'] res=[] forroot,dirnames,filenamesinos.walk(os.path.expanduser('~/rocky0429')): forextensioninsearch: forfilenameinfnmatch.filter(filenames,extension): res.append(os.path.join(root,filename)) print(res)
以上就是Python如何查找特定类型文件的详细内容,更多关于python查找文件的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。