glob --- Unix 风格路径名模式扩展

源代码: Lib/glob.py


glob 模块会根据 Unix shell 所使用的规则找出所有匹配指定模式的路径名,但返回结果的顺序是任意的。 它不做波浪号(tilde)扩展,但 *, ? 和用 [] 表示的字符范围将会被正确地匹配。 这是通过配合使用 os.scandir()fnmatch.fnmatch() 函数来实现的,而不是通过实际调用一个子 shell。

请注意,与 fnmatch.fnmatch()pathlib.Path.glob() 不同,以点号 (.) 开头的文件只能被同样以点号开头的模式匹配。(对于波浪号和 shell 变量扩展,请使用 os.path.expanduser()os.path.expandvars()。)

对于字面值匹配,请将元字符用方括号括起来。例如,'[?]' 匹配字符 '?'

glob 模块定义了以下函数:

glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

返回一个可能为空的路径名列表,其中包含与 pathname 匹配的项,pathname 必须是一个包含路径规格的字符串。pathname 可以是绝对路径(如 /usr/src/Python-1.5/Makefile)或相对路径(如 ../../Tools/*/*.gif),并且可以包含 shell 风格的通配符。 损坏的符号链接也会被包含在结果中(同 shell 一样)。 结果是否排序取决于文件系统。 如果在本函数调用期间,某个满足条件的文件被移除或添加,该文件的路径名是否会被包含在内是未指定的。

如果 root_dir 不为 None,它应为一个 类路径对象,用于指定搜索的根目录。它对 glob() 的作用与在调用前更改当前目录相同。如果 pathname 是相对路径,结果将包含相对于 root_dir 的路径。

此函数可以通过 dir_fd 参数来支持相对于目录描述符的路径

如果 recursive 为真值,模式 “**” 将匹配任何文件和零个或多个目录、子目录以及指向目录的符号链接。 如果该模式后跟一个 os.sepos.altsep,则文件将不会匹配。

如果 include_hidden 为真值,“**” 模式将匹配隐藏目录。

引发一个 审计事件 glob.glob,附带参数 pathname, recursive

引发一个 审计事件 glob.glob/2,附带参数 pathname, recursive, root_dir, dir_fd

备注

在大型目录树中使用 “**” 模式可能会消耗过多的时间。

备注

如果 pathname 包含多个 “**” 模式且 recursive 为真值,此函数可能会返回重复的路径名。

在 3.5 版本发生变更: 支持使用 “**” 进行递归通配。

在 3.10 版本发生变更: 增加了 root_dirdir_fd 形参。

在 3.11 版本发生变更: 增加了 include_hidden 形参。

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

返回一个 迭代器,它产生与 glob() 相同的值,而无需同时将它们全部存储在内存中。

引发一个 审计事件 glob.glob,附带参数 pathname, recursive

引发一个 审计事件 glob.glob/2,附带参数 pathname, recursive, root_dir, dir_fd

备注

如果 pathname 包含多个 “**” 模式且 recursive 为真值,此函数可能会返回重复的路径名。

在 3.5 版本发生变更: 支持使用 “**” 进行递归通配。

在 3.10 版本发生变更: 增加了 root_dirdir_fd 形参。

在 3.11 版本发生变更: 增加了 include_hidden 形参。

glob.escape(pathname)

转义所有特殊字符('?''*''[')。如果你想匹配一个可能包含特殊字符的任意字面字符串,这将非常有用。驱动器/UNC 共享点中的特殊字符不会被转义,例如在 Windows 上,escape('//?/c:/Quo vadis?.txt') 返回 '//?/c:/Quo vadis[?].txt'

在 3.4 版本加入。

glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)

将给定的路径规范转换为一个可用于 re.match() 的正则表达式。路径规范可以包含 shell 风格的通配符。

例如:

>>> import glob, re
>>>
>>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True)
>>> regex
'(?s:(?:.+/)?[^/]*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foo/bar/baz.txt')
<re.Match object; span=(0, 15), match='foo/bar/baz.txt'>

fnmatch.translate() 不同,路径分隔符和路径段对该函数是有意义的。默认情况下,通配符不匹配路径分隔符,并且 * 模式段精确匹配一个路径段。

如果 recursive 为真值,模式段 “**” 将匹配任意数量的路径段。

如果 include_hidden 为真值,通配符可以匹配以点号 (.) 开头的路径段。

可以向 seps 参数提供一个路径分隔符序列。如果未提供,则使用 os.sepaltsep(如果可用)。

参见

pathlib.PurePath.full_match()pathlib.Path.glob() 方法会调用此函数来实现模式匹配和通配。

在 3.13 版本加入。

示例

假设一个目录包含以下文件:1.gif2.txtcard.gif,以及一个名为 sub 的子目录,该子目录中仅包含文件 3.txtglob() 将产生以下结果。请注意路径中任何开头的组件是如何被保留的。

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']

如果目录包含以 . 开头的文件,默认情况下它们不会被匹配。例如,假设一个目录包含 card.gif.card.gif

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

参见

fnmatch 模块提供了 shell 风格的文件名(非路径)扩展。

参见

pathlib 模块提供了高级路径对象。