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 系统不能使用 *? 作为文件名,因此我示例文件中没有此类型的文件。

posted @ 2025-03-26 10:55  JPL-JUNO  阅读(81)  评论(0)    收藏  举报