Python 查找特定类型文件的三种方法及目录遍历

Alice
Alice
发布时间:2026-10-14| 3人浏览过
原创

本文详解 Python 中查找特定类型文件的三种常用方法。首先介绍利用字符串后缀匹配的基础方式,随后深入讲解 fnmatch 模块的通配符匹配与过滤功能,以及 glob 模块的简洁路径查找。此外,还演示了如何使用 os.walk 函数递归遍历目录树,结合 fnmatch 实现多级目录下特定格式文件的批量定位与处理。

写在之前

本文旨在介绍如何利用 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。