glob — Unix 风格的路径名模式扩展

源代码: Lib/glob.py


glob 模块根据 Unix shell 使用的规则查找所有与指定模式匹配的路径名,尽管结果以任意顺序返回。 不进行波浪号扩展,但 *? 和用 [] 表示的字符范围将被正确匹配。 这是通过协同使用 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* 可以是绝对路径(例如 /usr/src/Python-1.5/Makefile)或相对路径(例如 ../../Tools/*/*.gif),并且可以包含 shell 风格的通配符。 断开的符号链接包含在结果中(与 shell 中一样)。 结果是否排序取决于文件系统。 如果在调用此函数期间删除或添加了满足条件的文件,则不指定是否将包含该文件的路径名。

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

此函数可以使用 *dir_fd* 参数支持 相对于目录描述符的路径

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

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

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

引发一个带有参数 pathnamerecursiveroot_dirdir_fd审计事件 glob.glob/2

注解

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

注解

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

在 3.5 版本中更改: 支持使用“**”进行递归 glob。

在 3.10 版本中更改: 添加了 *root_dir* 和 *dir_fd* 参数。

在 3.11 版本中更改: 添加了 *include_hidden* 参数。

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

返回一个 迭代器,它产生与 glob() 相同的值,而无需实际同时存储它们。

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

引发一个带有参数 pathnamerecursiveroot_dirdir_fd审计事件 glob.glob/2

注解

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

在 3.5 版本中更改: 支持使用“**”进行递归 glob。

在 3.10 版本中更改: 添加了 *root_dir* 和 *dir_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() 方法,它们调用此函数来实现模式匹配和 globbing。

在 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 模块提供高级路径对象。