glob: 文件名模式匹配
glob: 文件名模式匹配
要创建一个文件名列表,要求其中各个文件名都有某个特定的拓展名、前缀或者中间都有某个共同的字符串,就可以使用 glob 而不用编写定制代码来扫描目录内容。
glob 的模式规则与 re 模块使用的正则表达式并不相同。实际上,glob 的模式准寻标准 UNIX 路径扩展规则。只使用几个特殊字符来实现两个不同的通配符和字符区间。模式规则应用于文件名中的段(在路径分隔符 / 处截至)。模式中的路径可以是相对路径或绝对路径。shell 变量名和波浪线(~)都不会被扩展。
通配符
星号(*)匹配一个文件名段中的 0 个或多个字符。例如,dir/*
。这个模式会匹配目录 dir 中的所有路径名(文件或目录),但不会进一步递归搜索到子目录。glob()
返回的数据不会排序。
>>> for name in sorted(glob.glob("dir/*")):
... print(name)
...
dir\file.txt
dir\file1.txt
dir\file2.txt
dir\file[.txt
dir\filea.txt
dir\fileb.txt
dir\subdir
>>>
要列出子目录中的文件,必须把子目录包含在模式中。
>>> print("Named explicitly:")
Named explicitly:
>>>
>>> for name in sorted(glob.glob("dir/subdir/*")):
... print(" {}".format(name))
...
dir/subdir\subfile.txt
>>>
>>> print("Named with wildcard:")
Named with wildcard:
>>> for name in sorted(glob.glob("dir/*/*")):
... print(" {}".format(name))
...
dir\subdir\subfile.txt
>>>
单字符通配符
问号(?)也是一个通配符,它会匹配文件名中该位置的单个字符。
>>> import glob
>>>
>>> for name in sorted(glob.glob("dir/file?.txt")):
... print(name)
...
dir\file1.txt
dir\file2.txt
dir\file[.txt
dir\filea.txt
dir\fileb.txt
>>>
字符区间
如果使用字符区间([a-z]
)而不是问好,则可以匹配多个字符中的一个字符。字符区间 [0-9]
会匹配所有单个数字。区间根据各字母/数字的字符码排序,短横线指示连续字符组成的一个不间断区间。这个区间值也可以写为 [0123456789]
。
>>> for name in sorted(glob.glob("dir/*[0-9].*")):
... print(name)
...
dir\file1.txt
dir\file2.txt
>>>
转义元字符
有时有必要搜索名字中包含一些特殊元字符的文件,glob 使用这些特殊元字符表示模式。escape()
函数会建立一个合适的模式,其中的特殊字符会被“转义”,使它们不会被 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'
Searching for: 'dir/*[*].txt'
Searching for: 'dir/*[[].txt'
dir\file[.txt
>>>
因为 Windows 系统不能使用
*
、?
作为文件名,因此我示例文件中没有此类型的文件。