Python glob.md

glob

即使glob API非常简单, 但这个模块包含了很多的功能. 在很多情况下, 尤其是你的程序需要寻找出文件系统中, 文件名匹配特定模式的文件时, 是非常有用的. 如果你需要包含一个特定扩展名, 或前缀, 或含有任何普通字符串的文件列表, 可以直接使用glob代替手工编程扫描目录内容.
glob中模式规则不是正则表达式, 而是, 符合标准Uinx路径扩展规则. 但是Shell变量名和符号(~)是不被扩充的, 只有一些特殊的字符: 两个不同的通配符和字母范围被支持. 模块规则适合于文件名的片段(以/为分隔), 但模式中的路径可以是相对或者绝对路径.

Example Data

假设当前工作目录下包含有以下一些文件.

# tree .
.
└── dir
    ├── file1.txt
    ├── file2.txt
    ├── filea.txt
    ├── fileb.txt
    ├── file?.txt
    ├── file.txt
    ├── file[.txt
    ├── file*.txt
    └── subdir
        └── subfile.txt

2 directories, 9 files

Wildcards

glob.glob(pathname, *, recursive=False):返回一个与pathname匹配的路径组成的list,该list可能为空。 该参数必须为包含路径说明的字符串。pathname 可以为绝对路径 (like /usr/src/Python-1.5/Makefile) 或相对路径 (like ../../Tools/*/*.gif), 并且可以包含shell风格的通配符。损坏的符号链接将被包含在结果中 (类似于shell中)。如果 recursive 设置为真,“**” 将匹配所有存在的目录和子目录和任何文件。如果匹配式以 os.sep 结尾, 只对目录和子目录进行匹配。

举例
*匹配名字片段中的0个或多个字符, 例如, dir/* .

import glob

for name in sorted(glob.glob('dir/*')):
    print(name)

该模式在目录中匹配每个路径名(文件或目录),而不需要进一步递归到子目录中。glob()返回的数据没有排序,因此这里的示例对它进行排序,以便更容易地研究结果。

# python glob_study.py
dir/file*.txt
dir/file.txt
dir/file1.txt
dir/file2.txt
dir/file?.txt
dir/file[.txt
dir/filea.txt
dir/fileb.txt
dir/subdir

要在子目录中列出文件,必须将子目录包含在模式中。

import glob

print('Named explicitly:')
for name in sorted(glob.glob('dir/subdir/*')):
    print('  {}'.format(name))

print('Named with wildcard:')
for name in sorted(glob.glob('dir/*/*')):
    print('  {}'.format(name))

上面显示的第一种情况显式列出子目录名称,而第二种情况则依赖通配符来查找目录。

Named explicitly:
  dir/subdir/subfile.txt
Named with wildcard:
  dir/subdir/subfile.txt

在这种情况下,结果是一样的。如果有另一个子目录,通配符将匹配两个子目录,并包含两个子目录中的文件名。

Single Character Wildcard

其他的被支持的通配符是问号(?). 它匹配在对应位置的任一单个字符. 例如:

import glob

for name in sorted(glob.glob('dir/file?.txt')):
    print(name)

匹配所有以”file”开头, 之后包含一个任何字符并以”.txt”结尾的文件.

dir/file*.txt
dir/file1.txt
dir/file2.txt
dir/file?.txt
dir/file[.txt
dir/filea.txt
dir/fileb.txt

Character Ranges

使用一个字符范围(a-z)而不是一个问号来匹配几个字符中的一个。此示例在扩展名之前查找名称中具有数字的所有文件。

import glob

for name in sorted(glob.glob('dir/*[0-9].*')):
    print(name)

字符范围[0-9]匹配任何单一数字. 这个范围是基于每个字符/数字的字符编码顺序, 破折号(-)表示一个范围, 上面的范围也可直接用[0123456789]来表示.

dir/file1.txt
dir/file2.txt

Escaping Meta-characters

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

举例
有时需要搜索包含特殊元字符的名称的文件,这些名称包含了其模式的特殊元字符。escape()函数构建了一个适当的模式,其中特殊字符“escaped”,因此它们不会被glob扩展或解释为特殊字符。

import glob

specials = '?*['

for char in specials:
    pattern = 'dir/*' + glob.escape(char) + '.txt'
    print('Searching for:  {!r}'.format(pattern))
    for name in sorted(glob.glob(pattern)):
        print(name)
    print()

每个特殊字符通过构建包含单个条目的字符范围来转义。

Searching for:  'dir/*[?].txt'
dir/file?.txt

Searching for:  'dir/*[*].txt'
dir/file*.txt

Searching for:  'dir/*[[].txt'
dir/file[.txt

原文地址:https://www.cnblogs.com/cuchadanfan/p/7153369.html