我有特定路径的文件,需要根据名称文件(yyyymmdd.faifb1p16m2.nc)逐一选择,其中yyyy是年,mm是月,而dd是日期。我做了这样的代码:

results=[]
base_dir = 'C:/DATA2013'
os.chdir(base_dir)
files = os.listdir('C:/DATA2013')
for f in files:
    results += [each for each in os.listdir('C:/DATA2013')
    if each.endswith('.faifb1p16m2.nc')]


如果我只选择1月,然后选择2月,依此类推,下一步该怎么做。谢谢。

最佳答案

两个正则表达式:


\d{4}(?:\d?|\d{2})(?:\d?|\d{2})\.faifb1p16m2\.nc
\d{8}\.faifb1p16m2\.nc


样本数据:


20140131.faifb1p16m2.nc
2014131.faifb1p16m2.nc
201412.faifb1p16m2.nc
201411.faifb1p16m2.nc
20141212.faifb1p16m2.nc
2014121.faifb1p16m2.nc
201411.faifb1p16m2.nc


第一个正则表达式将匹配所有7个条目。第二个正则表达式只能匹配1和5。我可能使正则表达式的方式比我需要的复杂。

您将要使用第二个正则表达式,但我仅以第一个为例。

from glob import glob
import re

re1 = r'\d{4}(?:\d?|\d{2})(?:\d?|\d{2})\.faifb1p16m2\.nc'
re2 = r'\d{8}\.faifb1p16m2\.nc'

l = [f for f in glob('*.faifb1p16m2.nc') if re.search(re1, f)]
m = [f for f in glob('*.faifb1p16m2.nc') if re.search(re2, f)]

print l
print
print m
#Then, suppose you want to filter and select everything with '12' in the list m
print filter(lambda x: x[4:6] == '12', m)


作为another similar solution shows,您可以放弃os.listdir()的glob,因此:

l = [f for f in glob('*.faifb1p16m2.nc') if re.search(re1, f)]`


成为:

l = [f for f in os.listdir() if re.search(re1, f)]


然后其余的代码就很棒。使用glob的妙处之一是您可以使用iglob,它与glob一样,但是作为迭代器,可以在访问包含大量文件的目录时提高性能。

还有一件事,这是另一个stackoverflow帖子,概述了python's infamous lambda feature。它通常用于功能mapreducefilter等。

10-07 15:06