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.sep或os.altsep,则文件将不会匹配。如果 include_hidden 为真值,“
**” 模式将匹配隐藏目录。引发一个 审计事件
glob.glob,附带参数pathname,recursive。引发一个 审计事件
glob.glob/2,附带参数pathname,recursive,root_dir,dir_fd。备注
在大型目录树中使用 “
**” 模式可能会消耗过多的时间。备注
如果 pathname 包含多个 “
**” 模式且 recursive 为真值,此函数可能会返回重复的路径名。在 3.5 版本发生变更: 支持使用 “
**” 进行递归通配。在 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()相同的值,而无需同时将它们全部存储在内存中。引发一个 审计事件
glob.glob,附带参数pathname,recursive。引发一个 审计事件
glob.glob/2,附带参数pathname,recursive,root_dir,dir_fd。备注
如果 pathname 包含多个 “
**” 模式且 recursive 为真值,此函数可能会返回重复的路径名。在 3.5 版本发生变更: 支持使用 “
**” 进行递归通配。在 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.sep和altsep(如果可用)。参见
pathlib.PurePath.full_match()和pathlib.Path.glob()方法会调用此函数来实现模式匹配和通配。在 3.13 版本加入。
示例¶
假设一个目录包含以下文件:1.gif、2.txt、card.gif,以及一个名为 sub 的子目录,该子目录中仅包含文件 3.txt。 glob() 将产生以下结果。请注意路径中任何开头的组件是如何被保留的。
>>> 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 模块提供了高级路径对象。