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()
。)
对于字面匹配,请将元字符括在括号中。例如,'[?]'
匹配字符 '?'
。
另请参阅
pathlib
模块提供高级路径对象。
- 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 为 true,则模式“
**
”将匹配任何文件以及零个或多个目录、子目录和指向目录的符号链接。如果模式后跟os.sep
或os.altsep
,则文件将不匹配。如果 include_hidden 为 true,则“
**
”模式将匹配隐藏目录。引发带有参数
pathname
、recursive
的 审计事件glob.glob
。引发带有参数
pathname
、recursive
、root_dir
、dir_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
。引发带有参数
pathname
、recursive
、root_dir
、dir_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 版新增。
例如,考虑一个包含以下文件的目录: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 风格的文件名(非路径)扩展