11.7. glob — Unix风格的路径名匹配

源代码: Lib/glob.py

glob 模块使用一个Unix shell规则的字符串查找与其匹配的所有路径, 但返回的结果是无序的。支持除波浪号~之外的其他符号,如*?及用[]包裹的字符范围。此函数内部使用了os.listdir()fnmatch.fnmatch()实现,而没有真正调用一个shell。请注意,与fnmatch.fnmatch()不同的是,glob将文件路径以点(.)开头视为一个特殊情况。(对于波浪号扩展和shell变量扩展,使用 os.path.expanduser()os.path.expandvars()。)

如果想匹配转义符本身,将转义符用方括号包裹。例如, '[?]'将匹配字符 '?'

参见

pathlib模块提供高级的路径对象处理。

glob.glob(pathname, *, recursive=False)

返回一个与pathname匹配的路径组成的list,该list可能为空。 该参数必须为包含路径说明的字符串。pathname 可以为绝对路径 (like /usr/src/Python-1.5/Makefile) 或相对路径 (like ../../Tools/*/*.gif), 并且可以包含shell风格的通配符。损坏的符号链接将被包含在结果中 (类似于shell中)。

如果 recursive 设置为真,“**” 将匹配所有存在的目录和子目录和任何文件。如果匹配式以 os.sep 结尾, 只对目录和子目录进行匹配。

注意

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

版本3.5中修改:支持启用递归时使用 “**”。

glob.iglob(pathname, recursive=False)

返回一个 iterator 迭代器,它产生与 glob() 相同的结果,但同时不会存储它们。

glob.escape(pathname)

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

版本3.4中新增。

例如,一个包含以下文件的目录: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风格的文件名(而不是路径)扩展