Python教程-Python Glob 模块
在Python中,我们有许多内置模块可用于执行各种任务,其中之一是使用Python模块找到和定位系统中所有遵循类似模式的文件。这种相似的模式可以是文件扩展名、文件名的前缀或两个或多个文件之间的任何相似性。我们有许多不同的Python模块,可以使用Python程序轻松执行此任务,但并非所有模块都像其他模块一样高效。在本教程中,我们将学习一个这种高效模块,即Python中的glob模块,借助它,我们可以在程序中使用特定模式进行文件匹配。我们将详细了解Python中的glob模块,如何在程序中使用它,它的关键特性以及该模块的应用。
Python中的Glob模块
借助Python的glob模块,我们可以搜索所有文件的路径名称,这些文件与我们定义的特定模式匹配。文件匹配的指定模式是根据Unix shell规则定义的。按照这些规则执行特定模式文件匹配任务得到的结果将以任意顺序返回给程序的输出。在使用文件匹配模式时,我们必须满足glob模块的一些要求,因为该模块可能会遍历本地磁盘上某个位置的文件列表。该模块通常只会遍历那些遵循特定模式的文件的文件列表。
模式匹配函数
在Python中,我们有几个函数,可以使用这些函数列出与程序中定义的特定模式匹配的文件。借助这些函数,我们可以获取与指定文件夹中给定模式匹配的文件的结果列表,顺序是任意的。
我们将在本节中讨论以下这些函数:
- fnmatch()
- scandir()
- path.expandvars()
- path.expanduser()
在上述列表中的前两个函数,即fnmatch.fnmatch()和os.scandir()函数,实际上用于执行模式匹配任务,而不是通过在Python中调用子shell。这两个函数执行模式匹配任务,并以任意顺序获取所有文件名的列表。这里有一个注意事项,glob模块将所有以点(.)开头的文件名视为特殊情况,这在fnmatch.fnmatch()函数中非常不常见。
列表中的最后两个函数,即os.path.expandvars()和os.path.expanduser()函数,可用于文件名模式匹配任务中的shell和波浪线变量扩展。
模式的规则
如果有人认为我们可以定义或使用任何模式来执行模式匹配文件名任务,那么让我们在这里澄清一下,这是不可能的。我们无法定义或使用任何模式来收集具有相同模式的文件列表。在定义用于文件名模式匹配函数的模式时,我们必须遵循一组特定规则。
在本节中,我们将讨论必须记住并遵守的所有这些规则,以便在定义文件名模式匹配函数的模式时遵循这些规则。我们将只简要讨论这些规则,不深入讨论它们,因为它们不是本教程的主要重点。
以下是定义在glob模块的模式匹配函数内的模式的规则:
- 我们必须遵循UNIX路径扩展的标准规则来定义模式。
- 我们定义的模式内的路径应该是绝对或相对的,我们不能在模式内定义任何不明确的路径。
- 模式内允许的特殊字符仅为两个通配符,即'*'和'?',模式内可以表示的普通字符包含在[]内。
- 用于glob模块函数的模式的规则适用于文件的文件名段(提供在函数中),并在文件的路径分隔符,即'/'处停止。
这些是我们在文件名模式匹配任务的glob模块函数内定义的模式的一些一般规则,我们必须遵守这些规则以成功执行任务。
Glob模块的应用
我们已经讨论了模式匹配对于在磁盘上查找类似文件时对我们有多么有用。在这里,我们将讨论Python glob模块的应用以及它对我们非常有帮助。
以下是Python glob模块的一些列出的应用,我们可以在这些函数中使用此模块:
- 有时,我们想要搜索具有特定前缀的文件、许多文件名中间的共同字符串或具有相同扩展名的文件。现在,要执行此任务,我们可能不得不编写一个扫描整个目录然后生成结果的代码。与之相反,glob模块在这种情况下非常有帮助,因为我们可以使用glob模块的函数执行此任务,非常容易,并且可以节省我们的时间。
- 除此之外,glob模块还在我们的程序中之一必须查找给定文件系统中所有文件的列表,这些文件的名称与相似模式匹配。glob模块可以轻松执行此任务,而不需要在其他子shell中打开程序的结果。
因此,通过查看glob模块的应用,我们可以说这个模块对我们有多重要,我们可以在哪里使用它来减少代码的复杂性并节省时间。
Glob模块函数
现在,我们将讨论glob模块的各种函数并了解它们在Python程序中的工作方式。我们还将了解这些函数如何帮助我们执行模式匹配任务。请查看glob模块中的以下函数列表,借助这些函数,我们可以非常顺畅地执行文件名模式匹配任务:
- iglob()
- glob()
- escape()
现在,我们将简要讨论这些函数,然后通过在Python程序中使用它们来了解这些函数的实现。我们将在示例程序中使用上述给定的每个函数,获取遵循特定模式的文件名列表(我们将在函数中定义该模式)。
1. iglob() 函数:glob模块的iglob()函数非常有助于以任意顺序生成文件列表的任意值。我们可以使用iglob()方法创建Python生成器。我们可以使用glob模块创建的Python生成器来列出给定目录下的文件。此函数在调用时还会返回一个迭代器,该迭代器返回值(文件列表)而无需同时存储所有文件名。
语法:以下是在Python程序中使用iglob()函数的语法:
iglob(pathname, *, recursive=False)
如您在iglob()函数的语法中看到的,它总共接受三个参数,可以定义如下:
(i) pathname:pathname参数是该函数的可选参数,当我们在与Python安装相同的文件目录上工作的文件目录中工作时,甚至可以不定义它。我们必须定义从中收集遵循特定模式的文件列表的路径(也在函数内定义)。
(ii) recursive:这也是iglob()函数的可选参数,它只接受布尔值(true或false)。递归参数用于设置函数是否采用递归方法查找文件名。
(iii) '':这是iglob()函数的强制参数,因为在此处我们必须定义iglob()函数将收集文件名并在输出中列出的模式。我们在iglob()函数内定义的模式(例如文件的扩展名)应以''符号开头。
现在,让我们在示例程序中使用iglob()函数,以便更好地了解它的实现和功能。
示例 1:
请查看以下包含iglob()函数实现的Python程序:
# Import glob module in the program
import glob as gb
# Initialize a variable
inVar = gb.iglob("*.py") # Set Pattern in iglob() function
# Returning class type of variable
print(type(inVar))
# Printing list of names of all files that matched the pattern
print("List of the all the files in the directory having extension .py: ")
for py in inVar:
print(py)
输出:
<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()函数返回的列表将是一个字符串,该字符串应包含根据在函数内定义的路径规范定义的路径。与iglob()函数一样,glob()函数的字符串或迭代器实际上返回与iglob()函数返回的相同值,而无需在其中存储这些值(文件名)。
语法:
以下是在Python程序中使用glob()函数的语法:
glob(pathname, *, recursive = True)
正如您在glob()函数的语法中看到的,它也像iglob()函数一样总共接受三个参数。glob()函数中定义的三个参数与上面讨论的iglob()函数中定义的参数相同。现在,让我们在示例程序中使用glob()函数,以便更好地了解它的实现和功能。
示例 2:请查看以下包含glob()函数实现的Python程序:
# Import glob module in the program
import glob as gb
# Initialize a variable
genVar = gb.glob("*.py") # Set Pattern in glob() function
# Printing list of names of all files that matched the pattern
print("List of the all the files in the directory having extension .py: ")
for py in genVar:
print(py)
输出:
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
正如在上述示例程序中所看到的,我们遵循与iglob()函数示例1中相同的逻辑。该程序返回了与在glob()函数中定义的模式匹配的所有文件名的列表。
3. escape() 函数: escape() 函数在我们定义的字符序列中起到了非常重要的作用。escape() 函数非常有用,因为它允许我们转义特定的字符序列,这个字符序列是在函数中定义的。该函数非常适用于查找文件名中包含特定字符(如在函数中定义的)的文件。它会通过匹配文件名中的任意文本字符串与带有特殊字符的序列匹配来实现。
语法:
以下是在Python程序中使用glob模块的escape()函数的语法:
>> escape(pathname)
escape() 函数应该与 glob() 或 iglob() 函数一起使用,以便我们可以将文件名列表作为输出结果打印出来。现在,让我们在一个示例程序中使用这个 escape() 函数,以便更好地理解它的实现和功能。
示例 3: 请看下面的Python程序,其中实现了 escape() 函数:
# Import glob module in the program
import glob as gb
# Initialize a variable
charSeq = "-_#"
print("Following is the list of filenames that match the special character sequence of escape function: ")
# Using nested for loop to get the filenames
for splChar in charSeq:
# Pathname for the glob() function
escSet = "*" + gb.escape(splChar) + "*" + ".py"
# Printing list of filenames with glob() function
for py in (gb.glob(escSet)):
print(py)
输出:
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 模块在执行文件名模式匹配任务方面的实用性,以及如何获取遵循特定模式的所有文件的列表。