# 11.7. `glob` — Unix 风格路径名模式扩展

源代码: Lib/glob.py

`glob` 模块可根据 Unix 终端所用规则找出所有匹配特定模式的路径名，但会按不确定的顺序返回结果。 波浪号扩展不会生效，但 `*`, `?` 以及表示为 `[]` 的字符范围将被正确地匹配。 这是通过配合使用 `os.scandir()` 和 `fnmatch.fnmatch()` 函数来实现的，而不是通过实际发起调用子终端。 请注意不同于 `fnmatch.fnmatch()`，`glob` 会将以点号 (`.`) 开头的文件名作为特殊情况来处理。 （对于波浪号和终端变量扩展，请使用 `os.path.expanduser()` 和 `os.path.expandvars()`。）

对于字面值匹配，请将原字符用方括号括起来。 例如，`'[?]'` 将匹配字符 `'?'`。

参见

`pathlib` 模块提供高级路径对象。

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

  返回匹配 pathname 的可能为空的路径名列表，路径名必须为包含一个路径描述的字符串。 pathname 可以是绝对路径 (如 `/usr/src/Python-1.5/Makefile`) 或相对路径 (如 `../../Tools/*/*.gif`)，并且可包含 shell 风格的通配符。 无效的符号链接可以包含在结果中 (与在 shell 中一样)。

  If recursive is true, the pattern “`**`” will match any files and zero or more directories and subdirectories. If the pattern is followed by an `os.sep`, only directories and subdirectories match.

  注解

  在一个较大的目录树中使用 “`**`” 模式可能会消耗非常多的时间。

  在 3.5 版更改: 支持使用 “`**`” 的递归 glob.

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

  返回一个 iterator，它会产生与 `glob()` 相同的结果，但不会实际地同时保存它们。

`glob.``escape`(pathname)

  转义所有特殊字符 (`'?'`, `'*'` 和 `'['`)。 这适用于当你想要匹配可能带有特殊字符的任意字符串字面值的情况。 在 drive/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 风格文件名（而非路径）扩展