Python之glob、fnmatch

glob:Unix样式路径名模式扩展

使用glob模块可以找到与某一特定模式相匹配的所有路径名称,该模式定义规则与Unix Shell相同。尽管没有tidle expansion,’*‘、’?‘、’[]‘仍然可正确匹配。glob中通过调用os.listdir()和fnmatch.fnmatch()实现路径匹配,而不是调用一个subshell。注意:对以’.‘开始的文件名,glob与fnmatch.fnmatch()的处理有所不同。

glob.glob(pathname)

返回一个与pathname匹配的路径名列表(可能为空)。pathname是一个路径说明字符串,可以包含shell-style通配符,可以是绝对路径(例如:/usr/src/Python-1.5/Makefile),也可以是相对路径(例如:../../Tools//.gif)。Broken symlinks are included in the results (as in the shell).

glob.lglob(pathname)

参数pathname与glob()一样,但这里返回一个迭代器,并不会保存匹配结果。

Example1:假设一个目录中包含:1.gif、2.txt、card.gif。

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

Example2:假设一个目录中包含:card.gif、.card.gif,默认情况下以’.’开始的文件名不会被匹配。

>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']

fnmatch:Unix文件名模式匹配

fnmatch模块提供对Unix shell-style通配符的支持,它与正则表达式不同(见re模块)。shell-style中的一些特定字符如下:

PatternMeaning
*matches everything
?matches any single character
[seq]matches any character in seq
[!seq]matches any character not in seq

对于文字匹配(literal match),将元字符(meta-characters)括在括号中,例如,’[?]’匹配字符’?’。
注意:fnmatch中文件名分隔符(例如Unix中的’/‘)不是特别字符,以句号’.’开始的文件名也不是特别的,可以被‘*’和‘?’匹配。

fnmatch.fnmatch(filename,pattern)

返回True或False,表示filename是否与pattern匹配,此处参数都是case-normalized(using os.path.normcase())。fnmatchcase()方法可以case-sensitive比较,而与操作系统标准无关。

import fnmatch
import os

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

fnmatch.fnmatchcase(filename,pattern)

返回True或False,表示filename是否与pattern匹配,该方法中没有应用os.path.normcase(),比较是case-sensitive的。

fnmatch.filter(names,pattern)

返回names列表中与pattern匹配的一个子集,功能与[n for n in names if fnmatch(n, pattern)]相同,但是效率更高。

fnmatch.translate(pattern)

将shell-style的模式转换为正则表达式,以便与re.match()一起使用。

>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'.*\\.txt\\Z(?ms)'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<_sre.SRE_Match object at 0x...>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值