首页 > 编程语言 >Python 如何查找特定类型文件(以xls和xlsx为例)

Python 如何查找特定类型文件(以xls和xlsx为例)

时间:2022-10-07 23:13:38浏览次数:52  
标签:xlsx 为例 Python glob py file fnmatch txt os

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

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

1. 使用 fnmatch 标准库

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

1 >>> import os
2 >>> [txt for txt in os.listdir('.') if txt.endswith('.txt')]
3 ['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 个文件进行匹配性测试,具体请看下面代码:

 1 >>> import os
 2 >>> import fnmatch
 3 >>> os.listdir('.')
 4 ['test.py', 'c.py', 'b.txt', 'a.txt']
 5 >>> [txt for txt in os.listdir('.') if fnmatch.fnmatch(txt, '*.txt')]
 6 ['b.txt', 'a.txt']
 7 >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[a-c]*')]
 8 ['c.py', 'b.txt', 'a.txt']
 9 >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[!a-c]*')]
10 ['test.py']

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

1 >>> import os
2 >>> import fnmatch
3 >>> file = os.listdir('.')
4 >>> file
5 ['test.py', 'c.py', 'b.txt', 'a.txt']
6 >>> fnmatch.filter(file, '[a-c]*')
7 ['c.py', 'b.txt', 'a.txt']
8 >>> fnmatch.filter(file, '[!a-c]*')
9 ['test.py']

2.使用 glob 定位

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

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

1 >>> import glob
2 >>> glob.glob('*.txt')
3 ['b.txt', 'a.txt']
4 >>> glob.glob('[a-c]*')
5 ['c.py', 'b.txt', 'a.txt']
6 >>> glob.glob('[!a-c]*')
7 ['test.py']

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

遍历目录树

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

下面我们来演示一下 os.walk 函数的用法,做一个小的练习,来遍历一下‘D:\Python_Sctipts\xlwings_scrtips’目录及其子目录下的所有 xls和xlsx:

方案一:

 1 import fnmatch
 2 import os
 3 
 4 path = r'D:\Python_Sctipts\xlwings_scrtips'
 5 search = ['*.xls', '*.xlsx']
 6 
 7 def getfilter(excel_path, search_list):
 8   xls_list = []
 9   for root, dirnames, filenames in os.walk(path):
10     for extension in search:
11       for filename in fnmatch.filter(filenames, extension):
12         xls_list.append(os.path.join(root, filename))
13   return xls_list
14 
15 print(getfilter(path, search))

方案二不使用fnmath库:

 1 import os
 2 
 3 filter = ['.xls','.xlsx']  # 设置过滤后的文件类型 当然可以设置多个类型
 4 
 5 def all_path(dirname):
 6   result = []  # 所有的文件
 7   for maindir, subdir, file_name_list in os.walk(dirname):
 8     # print("1:",maindir) #当前主目录
 9     # print("2:",subdir) #当前主目录下的所有目录
10     # print("3:",file_name_list)  #当前主目录下的所有文件
11     for filename in file_name_list:
12       apath = os.path.join(maindir, filename)  # 合并成一个完整路径
13       ext = os.path.splitext(apath)[1]  # 获取文件后缀 [0]获取的是除了文件名以外的内容
14     
15       if ext in filter:
16         result.append(apath)
17   return result
18 
19 print(all_path(r'D:\Python_Sctipts\xlwings_scrtips'))

以上就是Python 如何查找特定类型文件的详细内容

标签:xlsx,为例,Python,glob,py,file,fnmatch,txt,os
From: https://www.cnblogs.com/ppguo/p/16767454.html

相关文章

  • 在VSCODE的终端运行Python时汉字乱码问题处理
    问题描述在VSCODE的终端运行Python时,打印输出中文时汉字出现乱码,文件编码都是UTF-8解决步骤1、打开Settings配置窗口(Ctrl+,)2、搜索:code-runner.executor如下图所示......
  • CentOS 7.9 安装 Python-3.9.5
    一、CentOS7.9安装Python-3.9.5地址https://www.python.orghttps://www.python.org/ftp/python/3.9.5查看当前python版本pythonpython-V可以看到执行python......
  • python安装presto包不能找到路径 PackagesNotFoundError: The following packages ar
    在使用ACCEL_sifting.py文件选取脉冲星候选体文件时,缺少必要的包,安装出错,记录安装过程。condainstallpresto报错如下:PackagesNotFoundError:Thefollowingpackages......
  • Python语法之异常处理
    前面我们已经介绍了模块的创建和包的应用,在这一小节,我们将继续来学习Python的异常处理方法,了解常见异常的处理方法以及异常的基本概念。1.什么是异常嫦娥本是后羿之妻,......
  • python基础之周末小结
    python基础之周末小结目录一、与用户交互1.获取用户输入2.输出内部信息二、格式化输出三、基本运算符1.数学运算符2.简化写法3.比较运算符四、常用赋值赋1.链式赋值2.交叉......
  • python 数据容器(序列)的切片
    序列:内容连续,有序,可使用下标索引的一类数据容器列表、元组、字符串,均可以视为序列。切片:从一个序列中,取出一个子序列。语法:序列[起始下标:结束下标:步长]表示从序列中,......
  • 你帮我助”软件开发 (以python为程序语言)
    在疫情期间,各个小区居民发挥互助精神,进行物品交换,互通有无。请你编写一个物品交换软件该程序允许添加物品的信息,删除物品的信息,显示物品列表,也允许查找物品的信息你实现......
  • aardio多线程调用python防止界面卡顿
    在aardio中使用多线程目录在aardio中使用多线程问题多线程python里的多线程尝试直接把这个放到aardio里面GIL锁存钱取钱问题aardio给出的案例调用的步骤代替解决......
  • Pythontext_4
    1实例一:使用字符串拼接输出一个关于程序员的笑话2programmer_1='程序员甲:搞IT太幸苦了,我想换行……怎么办?'3programmer_2='程序员乙:敲一下回车键'4print(progr......
  • 入门神经网络-Python 实现(下)
    假设对BP的认识回顾紧接着上篇,整到了,MES的公式和代码的实现.\(MSE=\frac{1}{n}\sum\limits_{i=1}^n(y_i-\haty_i)^2\)n表示样本数,这......