幽谷奇峰 | 燕雀鸣幽谷,鸿鹄掠奇峰

Python2标准库之fnmatch--Unix风格的文件名模式匹配


Python2标准库之glob--Unix风格的路径匹配 一文中提到的 glob 模块在进行模式匹配时,调用的就是本文要介绍的 fnmatch 模块。

本模块提供了对 Unix Shell 风格的通配符的支持。和正则表达式类似,但并不一样。它支持的四种通配符模式,在 glob 一文中已有介绍,这里不再赘述。

fnmatch.fnmatch(filename, pattern)

测试 filename 字符串是否匹配 pattern 字符串,匹配则返回 True,否则返回 False. 如果操作系统对文件名是不区分大小写的,那么在进行比较匹配时两个参数都会被归一为大写或者小写。

下面的例子将会打印出当前目录中扩展名为 .txt 的所有文件名:

1
2
3
4
5
6
import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file

fnmatch.fnmatchcase(filename, pattern)

测试 filename 字符串是否匹配 pattern 字符串,匹配则返回 True,否则返回 False. 此匹配是大小写敏感的。

fnmatch.filter(names, pattern)

返回列表 names 中匹配模式 pattern 的子集。和 [n for n in names if fnmatch(n, pattern)] 的效果一样,但效率更高。

fnmatch.translate(pattern)

将 Shell 风格的模式 pattern 转换成正则表达式。

1
2
3
4
5
6
7
8
>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'.*\\.txt$'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<_sre.SRE_Match object at 0x...>

综合运用示例

此模块一般和遍历目录树的 os.walk()os.listdir() 配合使用。

1
2
3
4
5
6
import os, fnmatch

for root, dirs, files in os.walk(DIRECTORY):
    for file in files:
        if fnmatch.fnmatch(file, PATTERN):
            print file

本作品由 Yysfire 创作,采用知识共享许可协议进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/python/python2-standard-library-fnmatch.html


相关文章


最后修改
2014-06-29 18:14
发表时间
2012-12-07 00:49
本文标签
fnmatch 1 Python 3
关注我

侧栏导航