Python使用fnmatch排除目录



我正在处理一些无法更改的遗留代码(原因)。

它使用fnmatch.fnmatch来过滤路径列表,就像这样(简化):

import fnmatch
paths = ['a/x.txt', 'b/y.txt']
for path in paths:
if fnmatch.fnmatch(path, '*.txt'):
print 'do things'

通过配置,我可以更改用于匹配文件的模式。我需要排除b/中的所有内容,这可能吗?

通过阅读文档(https://docs.python.org/2/library/fnmatch.html)事实并非如此,但我认为询问是值得一试的。

来自fnmatch.fnmatch文档:

模式是Unix shell风格:

*匹配所有

匹配任何单个字符的

[seq]匹配seq 中的任何字符

[!seq]匹配任何不在seq中的字符

运行时:

for path in paths:
if fnmatch.fnmatch(path, '[!b]*'):
print path

我得到:

a/x.txt

不知怎么的,这个方法适用于"!"之后的字母表

例如,在我的案例中,来自col_names列表

['#Spec No','Name','Date(DD/MM/YYYY)','Time(hh:MM:ss)','Year',"分数日"、"分数时间"、"扫描"、"着色"、"SZA",'NO2_UV.RMS','NO2_UV-RefZm','NO2_UV.RefNum','NO2_UV.SlCol(bro)','NO2_UV.SleErr(bro)','NO2_UV-SlCol(ring)','NO2_UV.sleErr,‘NO2_UV.SlCol(HCHO)’、‘NO2_UV-SlErr(HCHO,‘NO2_UV.SleErr(O4)’,‘NO2_UV-SlCol(O3a)’,’NO2_UV.sleErr,'NO2_UV.SlCol(O3223k)','NO2_UV-SlErr(O3223k','NO2,‘NO2_UV.SlErr(NO2)’,‘NO2_UV-SlCol(no2a)’,’NO2_UV.SlErr,'NO2_UV.Offset(常量)','NO2_UV-Err(Offset(常量))','NO2_UV.Offset(Order 1)','NO2_UV-Err(Offset(Order 1,'NO2_UV.Shift(光谱)','NO2_UV-Stretch(光谱)1',"NO2_UV.Stretch(光谱)2',"HCHO.RMS',"HCHO.RefZm',"HCHO.RefNum',"HCHO.SlCol(bro)"、"HCHO.SlErr(bro,"HCHO.SlErr(环)","HCHO.SlCol(HCHO)",‘HCHO.SlCol(O4)’,‘HCHO.SlErr(O4)‘,’HCHO.Sl Col(O3a)‘,"HCHO.SlErr(O3a)","HCHO.SlCol(O3223k)",‘HCHO.SlCol(NO2)’、‘HCHO.SlErr(NO2)‘、‘HCHO偏移量(常数)’,'HCHO.Err(偏移量(常量))','HCHO.Offset(Order 1)',"HCHO.Err(偏移量(阶数1))","HCHO.Shift(光谱)","六氯环己烷拉伸(光谱)1","六氯环己烷伸展(光谱)2","通量318","Fluxes 330',"Fluxes 390',"Fluxes 440']我想搜索所有不包含NO2_UV的名称。如果我做

header_hcho = fnmatch.filter(col_names, '[!NO2_UV.]*');

它排除了第二个元素"名称"。,因为它以N开头,结果和我做一样

header_hcho = fnmatch.filter(col_names, '[!N]*');

所以,我采用了一种相当老派的方法

header_hcho = []
idx=0
for idx in range(0, len(col_names)):
if col_names[idx].find("NO2_UV") == -1:
header_hcho.append(col_names[idx])
idx=idx+1

最新更新