Python Glob 模块

2024年8月29日 | 阅读 10 分钟

在 Python 中,我们有许多内置模块可以执行各种任务,其中一个我们希望通过 Python 模块执行的任务是查找并定位系统中遵循相似模式的所有文件。这种相似模式可以是文件扩展名、文件名的前缀,或者多个文件之间的任何相似之处。我们有许多不同的 Python 模块,可以使用 Python 程序轻松执行此任务,但并非所有模块都像其他模块一样高效。在本教程中,我们将学习其中一个高效的模块,即 Python 中的 glob 模块,我们可以通过在程序中使用它来执行带有特定模式的文件匹配。我们将详细了解 Python 中的 glob 模块,如何在一个程序中使用它,它的主要特点以及该模块的应用。

Python 中的 Glob 模块

借助 Python glob 模块,我们可以搜索所有与我们定义的特定模式匹配的文件路径名。文件匹配的指定模式根据 Unix shell 规定的规则定义。通过遵循这些规则进行特定模式文件匹配所获得的结果将以任意顺序在程序输出中返回。在使用文件匹配模式时,我们必须满足 glob 模块的一些要求,因为该模块可以遍历我们本地磁盘中某个位置的文件列表。该模块将主要遍历磁盘中仅遵循特定模式的文件列表。

模式匹配函数

在 Python 中,我们有几个函数可以用来列出与我们在程序中函数内部定义的特定模式匹配的文件。借助这些函数,我们可以在输出中以任意顺序获取指定文件夹中与给定模式匹配的文件列表结果。

我们将在本节讨论以下这些函数

  1. fnmatch()
  2. scandir()
  3. path.expandvars()
  4. path.expanduser()

上面列表中前两个函数,即 fnmatch.fnmatch()os.scandir() 函数,实际上是用来执行模式匹配任务,而不是通过在 Python 中调用子 shell。这两个函数执行模式匹配任务并获取所有文件名的列表,而且是以任意顺序。这里有一个需要注意的地方,glob 模块将所有以点 (.) 开头的文件名视为特殊情况,这在 fnmatch.fnmatch() 函数中不太可能发生。

列表中最后两个函数,即 os.path.expandvars()os.path.expanduser() 函数,可用于文件名模式匹配任务中的 shell 和波浪号变量扩展。

模式规则

如果有人认为我们可以定义或使用任何模式来执行模式匹配文件名任务,那么让我们在这里澄清一下,这是不可能的。我们不能定义任何模式或使用任何模式来收集相同的文件列表。在为 glob 模块中的文件名模式匹配函数定义模式时,我们必须遵循一组特定的规则。

在本节中,我们将讨论所有这些规则,在为文件名模式匹配函数定义模式时,我们必须牢记并遵守它们。我们只会简要讨论这些规则,而不会深入探讨它们,因为它们不是本教程的主要重点。

以下是我们为 glob 模块的模式匹配函数内部定义的模式的一组规则

  • 在模式匹配中,我们必须遵循 UNIX 路径扩展的所有标准规则。
  • 我们在模式中定义的路径必须是绝对路径或相对路径,不能在模式中定义任何不明确的路径。
  • 模式中允许的特殊字符只有两个通配符,即“*,?”,以及可以在模式中表示的普通字符用 [] 表示。
  • glob 模块函数的模式规则适用于文件名段(在函数中提供),并在文件的路径分隔符(即“/”)处停止。

这些是我们在 glob 模块函数中为文件名模式匹配任务定义的模式的一些一般规则,我们必须遵循这些规则才能成功执行任务。

Glob 模块的应用

我们已经讨论过当我们寻找磁盘上相似文件时,模式匹配是多么有用。在这里,我们将讨论 **glob** 模块的应用以及它对我们有多大帮助。

以下是 Python glob 模块的一些列出的应用,我们可以在给定的函数中使用此模块

  1. 有时,我们想要搜索一个文件名具有特定前缀、许多文件名中间有共同字符串或具有相同特定扩展名的文件。现在,要执行此任务,我们可能需要编写代码来扫描整个目录,然后生成结果。相反,在这种情况下,**glob 模块**将非常有帮助,因为我们可以使用 glob 模块的函数非常容易地执行此任务,并节省我们的时间。
  2. 除此之外,**Glob 模块**在我们的一个程序必须在给定文件系统中查找所有文件列表,且文件名匹配相似模式时也非常有用。Glob 模块可以轻松执行此任务,而且无需在其他子 shell 中打开程序结果。

因此,通过查看 glob 模块的应用,我们可以知道这个模块对我们有多么重要,以及我们可以在哪里使用它来减少代码的复杂性并节省时间。

Glob 模块函数

现在,我们将讨论 glob 模块的更多函数,并了解它们在 Python 程序中的工作原理。我们还将学习这些函数如何帮助我们完成模式匹配任务。查看 glob 模块中我们拥有的以下函数列表,借助这些函数,我们可以非常流畅地执行文件名模式匹配任务

  1. iglob()
  2. glob()
  3. escape()

现在,我们将简要讨论这些函数,然后通过在 Python 程序中使用它们来理解它们的实现。我们将在一个示例程序中使用上述每个函数,并在输出中获取遵循相似模式(我们将在函数中定义)的文件名列表。

1. iglob() 函数:glob 模块的 iglob() 函数在输出中生成文件列表的任意值时非常有用。我们可以使用 iglob() 方法创建一个 Python 生成器。我们可以使用 glob 模块创建的 Python 生成器来列出给定目录下的文件。当调用此函数时,它还会返回一个迭代器,并且它返回的迭代器会在不同时存储所有文件名的情况下生成值(文件列表)。

语法:以下是在 Python 程序中使用 glob 模块 iglob() 函数的语法

正如我们在 iglob() 函数的语法中看到的,它总共接受三个参数,可以定义如下:

(i) pathname: pathname 参数是函数的可选参数,当我们处理与 Python 安装目录相同的文件目录时,甚至可以省略它。我们必须定义从何处收集遵循相似模式(也定义在函数内部)的文件列表的路径名。

(ii) recursive: 这也是 iglob() 函数的一个可选参数,它只接受布尔值(true 或 false)。recursive 参数用于设置函数是否遵循递归方法来查找文件名。

(iii) '*': 这是 iglob() 函数的强制参数,因为在这里我们必须定义 iglob() 函数将收集文件名并将其列在输出中的模式。我们在 iglob() 函数中定义的用于模式匹配的模式(例如文件扩展名)应该以“*”符号开头。

现在,让我们在一个示例程序中使用 iglob() 函数,以便更好地理解它的实现和功能。

示例 1

请看下面实现 iglob() 函数的 Python 程序

输出

<class 'generator'>
List of the all the files in the directory having extension .py: 
adding.py
changing.py
code#1.py
code#2.py
code-3.py
code-4.py
code.py
code37.py
code_5.py
code_6.py
configuring.py

说明

我们首先导入了 glob 模块,以便在程序中使用它的 iglob() 函数。之后,我们初始化了一个变量,并在其中使用了 iglob() 函数,在 iglob() 函数内部,我们定义了函数将执行文件名模式匹配的模式。我们在 iglob() 函数中定义的模式是所有带有 .py 扩展名的文件,即 "*.py"。之后,我们返回了我们初始化的变量的类类型。再之后,我们对该变量使用了 for 循环,以打印 iglob() 函数匹配到的所有文件名列表,这些文件名符合我们定义的模式。

正如我们在输出中看到的,第一个程序打印了初始化变量的类类型,然后打印了扩展名为“.py”的文件列表。

2. glob() 函数:借助 glob() 函数,我们还可以获取与特定模式匹配的文件列表(我们必须在函数内部定义该特定模式)。glob() 函数返回的列表将是一个字符串,其中应包含根据我们在函数内部定义的路径规范的路径。glob() 函数的字符串或迭代器实际上返回与 iglob() 函数返回的相同值,而无需实际存储这些值(文件名)。

语法

以下是在 Python 程序中使用 glob 模块 glob() 函数的语法

正如我们在 glob() 函数的语法中看到的,它也像 iglob() 函数一样总共接受三个参数。glob() 函数中定义的三个参数与我们上面在 iglob() 函数中读到的相同。现在,让我们在一个示例程序中使用 glob() 函数,以便更好地理解它的实现和功能。

示例 2:请看下面实现 glob() 函数的 Python 程序

输出

List of the all the files in the directory having extension .py: 
adding.py
changing.py
code#1.py
code#2.py
code-3.py
code-4.py
code.py
code37.py
code_5.py
code_6.py
configuring.py

正如我们在上面的示例程序中看到的,我们遵循了与示例 1 中 iglob() 函数相同的逻辑。程序返回了所有匹配我们在 glob() 函数中设置的模式的文件名列表。

3. escape() 函数:escape() 函数变得非常有影响力,因为它允许我们转义我们在函数中定义的给定字符序列。escape() 函数对于查找文件名中包含特定字符(正如我们将在函数中定义)的文件非常方便。它将通过将文件名中的任意文字字符串与其中的特殊字符匹配来匹配序列。

语法

以下是在 Python 程序中使用 glob 模块 escape() 函数的语法

escape() 函数应与 glob() 或 iglob() 函数一起使用,以便我们能够将文件名列表作为结果输出。现在,让我们在一个示例程序中使用 escape() 函数,以便更好地理解它的实现和功能。

示例 3:请看下面实现 escape() 函数的 Python 程序

输出

Following is the list of filenames that match the special character sequence of escape function: 
code-3.py
code-4.py
code_5.py
code_6.py
code#1.py
code#2.py

说明

我们首先为 escape() 序列定义了一个字符序列,以便 escape() 函数将收集所有文件名中包含该特殊字符序列的文件。我们使用了一个嵌套的 for 循环,首先我们从 escape() 函数为 glob() 函数创建了一个路径名。之后,我们在 glob() 函数中使用了该路径名来打印匹配之前定义的特殊字符序列的文件名列表。

正如我们在输出中看到的,所有文件名都包含我们在程序中定义的特殊字符序列。

结论

因此,正如我们使用了 glob 模块的函数,即 glob()、escape() 和 iglob() 函数,我们现在可以轻松理解 glob 模块及其功能。通过这一点,我们也可以看出 glob 模块在执行文件名模式匹配任务方面是多么有用,以及我们如何获取所有遵循特定模式的文件列表。