Python使用fnmatch排除目录

时间:2017-01-04 18:40:07

标签: python-2.7 pattern-matching wildcard

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

它使用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)看来似乎不是,但我认为值得一试。

2 个答案:

答案 0 :(得分:1)

来自fnmatch.fnmatch文档:

  

模式是Unix shell风格:

     
    

*匹配所有内容

         

?匹配任何单个字符

         

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

         

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

  

当我跑步时:

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

我明白了:

a/x.txt

答案 1 :(得分:0)

不知何故,这种方法适用于"!'

之后的字母表

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

[' #Specus No','姓名','日期(DD / MM / YYYY)','时间( hh:mm:ss)','年',        ' Fractional day' Fractional time',' Scans'' Tint',' SZA',        ' NO2_UV.RMS',' NO2_UV.RefZm',' NO2_UV.RefNumber',' NO2_UV.SlCol(bro)',        ' NO2_UV.SlErr(兄弟)',#39; NO2_UV.SlCol(戒指)'' NO2_UV.SlErr(戒指)',        ' NO2_UV.SlCol(HCHO)' NO2_UV.SlErr(HCHO)'' NO2_UV.SlCol(O4)',        ' NO2_UV.SlErr(O4)'' NO2_UV.SlCol(O3a)',' NO2_UV.SlErr(O3a)',        ' NO2_UV.SlCol(O3223k)'' NO2_UV.SlErr(O3223k)',#39; NO2_UV.SlCol(NO2)',        ' NO2_UV.SlErr(NO2)',' NO2_UV.SlCol(no2a)',' NO2_UV.SlErr(no2a)',        ' NO2_UV.Offset(常数)',' NO2_UV.Err(偏移(常数))',        ' NO2_UV.Offset(订单1)',' NO2_UV.Err(抵消(订单1))',        ' NO2_UV.Shift(Spectrum)',' NO2_UV.Stretch(Spectrum)1',        ' NO2_UV.Stretch(Spectrum)2',' HCHO.RMS',' HCHO.RefZm',' HCHO.RefNumber',        ' HCHO.SlCol(bro)' HCHO.SlErr(bro)' HCHO.SlCol(ring)',        ' HCHO.SlErr(戒指)' HCHO.SlCol(HCHO)' HCHO.SlErr(HCHO)',        ' HCHO.SlCol(O4)' HCHO.SlErr(O4)' HCHO.SlCol(O3a)',        ' HCHO.SlErr(O3a)' HCHO.SlCol(O3223k)' HCHO.SlErr(O3223k)',        ' HCHO.SlCol(NO2)' HCHO.SlErr(NO2)',' HCHO.Offset(常数)',        ' HCHO.Err(抵消(常数))',' HCHO.Offset(订单1)',        ' HCHO.Err(抵消(订单1))',' HCHO.Shift(Spectrum)',        ' HCHO.Stretch(Spectrum)1',' HCHO.Stretch(Spectrum)2',' Fluxes 318',        ' Fluxes 330',' Fluxes 390',' Fluxes 440'] 我想搜索所有不含NO2_UV的名字。 如果我做

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

它排除了第二个元素" Name&#34 ;.,因为它以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