资源代码:Lib/glob.py
glob模块找出所有的匹配Unix shell的特殊模式的路径名,但是结果返回的顺序不定。没有波浪号扩展被使用,但是*、?和用[]包裹范围内的字符会被正确的匹配。这个用法通过os.scandir()和fnmatch.fnmatch()函数的协调使用,并且也不是通过实际调用子shell实现。注意:不同于fnmatch.fnmatch(),glob对待文件名是以一个点(.)开头作为特殊情况。(对于波浪号和shell不同的表达,使用os.path.expanduser()和os.path.expandvars())。
对于先行匹配,将括号中的元字符包裹起来。例如:’[?]’匹配了字符’?’。
glob. glob(pathname. *, recursive=False)
返回一个可能空的路径名列表用于匹配pathname,它必须是一个包含路径规范的字符串。pathname可以是相对名,也可以是绝对名,并且可以包含shell风格的通配符。结果中包含了终端的链接(就像在shell中)。
如果recursive为真,“**”模式将会匹配然和文件和最少为零的目录和子目录。如果跟随os.sep模式,只有目录和子目录会被匹配。
注意:使用“**”模式在最大目录树中可能会消耗无法控制的大量时间。
glob. iglob(pathname, *, recursive=False)
返回一个迭代器,它获取glob()的相同值,并且实际上不同时存储它们。
glob. escape(pathname)
泄露所有的字符('?’、’*’和’[’)。如果你想要匹配一个可能包含特殊字符的任意线性字符串,你就会用到它。特殊字符在驱动/UNC共享点上不会被泄露,即:在Windows中escape(‘//?/c:/Quo vadis?.txt’)返回’//?/c:/Quovadis[?].txt’。
例如,考虑到一个目录包含以下文件: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']