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

原文地址:https://www.cnblogs.com/key01/p/10208993.html

时间: 2024-07-29 18:42:55

用 Python 定位特定类型文件的相关文章

Java用来进行批量文件重命名,批量提取特定类型文件

原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一个一个找出来太麻烦,所以做了第二个功能.       最近刚刚学了Java文件和流的知识,所以正好练练手,这也是自己的第一个exe程序,分享一下哈. (导出jar文件,以及用工具exe4j生成exe文件,这部分省略了哈) 用到的知识: 用到Java中文件,流的知识,以及简单的GUI知识. 功能:  

Python 批量创建同文件名的特定类型文件

看了很多批量创建文件和文件批量格式转换的code,感觉杀鸡焉用牛刀,自己写了几行轻量级的拿来给大家参考: 在out_dir目录下批量创建与in_dir目录下同文件名但后缀不同的文件. in_dir = "D:\\data\\State_310000\\"out_dir = "D:\\data\\State_310000\\output\\"files = os.listdir(in_dir) for filename in files: filename_split

python基础——元组、文件及其它

Python核心数据类型--元组 元组对象(tuple)是序列,它具有不可改变性,和字符串类似.从语法上讲,它们便在圆括号中,它们支持任意类型.任意嵌套及常见的序列操作. 任意对象的有序集合:与字符串和列表类似,元组是一个位置有序的对象集合(内容维持从左到右的顺序),可以嵌入到任何类别的对象中. 通过偏移存取:同字符串.列表一样,在元组中的元素通过偏移(而不是键)来访问.支持基于偏移的操作.如索引和分片. 属于不可变序列类型:类似字符串,元组是不可变的,它们不支持应用在列表中任何原处修改的操作.

Python批量删除指定文件夹下的指定类型的文件

Python作为一种脚本语言,其非常适合文件级的各种操作.下面的代码可以批量删除指定文件夹下的全部特定类型(CSV类型)的文件. import sys, csv , operator import os import glob for i in range(0, 20): path = "C:\\Python34\\Folder_" + str(i) for infile in glob.glob( os.path.join(path, '*.csv') ): os.remove(in

Python基础之一:文件类型及运算符

一.PYTHON文件类型 1.源代码 Python源代码的文件以"py"为扩展名,由Python解释,不需要编译: 2.字节代码 Python源文件经编译后生成的扩展名为"pyc"的文件: 编译方法:     importpy_compile     py_compile.compile("hello world.py") 3.优化代码 经过优化的源文件,扩展名为".pyo"  python –O –m py_compile 

linux查找特定类型的文件中是否包含特定字段

shell是个好东西,极大的方便了查询工作,之前遇到一个问题,查询包含有特定字段的特定文件,经过查询,命令如下: 1 find . -type f -name '*.cpp' print|xargs grep -r '#include' -l 上述命令的意思是查询包含有 '#include' 字符的 cpp文件,并给出文件名列表.具体需要熟悉find 和grep命令和各个参数的意思. 参考链接:http://blog.sina.com.cn/s/blog_691a84f301015khx.htm

Linux复制指定目录及子目录下特定类型的文件

主要参考这个: http://www.2cto.com/os/201208/144996.html 拷贝一些内容就是: 首先建立一个用于测试的目录 可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*.tes文件 目标是保持当前的目录结构,只把txt文件复制出来 方法一:当不需要的文件类型较为单一时,可以通过完全复制然后删除指定类型的文件完成 Step1 使用命令 cp -r test/ test2 将测试目录test下所有内容完全复制到test2. Step2 组合使用find及xa

在HDFS上删除某个路径下特定类型的文件,比如class类型文件,比如txt类型文件

1.先获取连接: public class Utils { public static FileSystem HDFS() throws Exception{ Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://potter2:9000"); System.setProperty("HADOOP_USER_NAME", "potter&quo

计算机二级python 知识点篇(文件和数据格式化)

计算机二级python 知识点篇(文件和数据格式化) 考纲考点 文件的使用: 文件打开. 关闭和读写 数据组织的维度: 一维数据和二维数据 一维数据的处理: 表示. 存储和处理 二维数据的处理: 表示. 存储和处理 采用CSV格式对一二维数据文件的读写 知识点1 文件包括两种类型: 文本文件和二进制文件. 二进制文件和文本文件最主要的区别在于是否有统一的字符编码 文本文件一般由单一特定编码的字符组成, 如UTF-8编码, 内容容易统一展示和阅读. 二进制文件直接由比特0和比特1组成, 文件内部数