2017-02-16 70 views
0

通常,我在Python中逐个遍历文件。现在我想循环他们逐组。我如何有效地阅读它们?如何循环读取文件组?

下面是一个例子来解释我的问题。

像这样指定的文件:

group1: m2000_01, m2000_02,..., m2000_12 
group2: m2001_01, m2001_02,...., m2001_12 
..... 
group17: m2016_01, m2016_02,...., m2016_12 

我想读在同一年文件的批处理计算和循环独处的时间连续。伪代码如下:

for year in list[2000,2001,...,2016]: 

    A=open(m2000_01), B=open(m2000_02), C=open(m2000_03).... # reading files section 

    mean2000 = (A + B + C ...)/12 
    #calculation body,how to set varibles for each file.such as A=m2000_01, B=m2000_02, ..., 
    #use a dict to set these files? 

print mean2000, mean2001,..., mean2016 #result I want 

也许我可以做一个列表,然后循环元素列表匹配(钛硅分子筛)并提取组文件。但是,如果有多组文件和组关键词(如上例中的2000)不规则。有没有解决类似问题的常用方法?我认为有一种行之有效的方法,但我不知道如何描述和搜索。如果这个问题很简单,请原谅我。

+1

你看了看glob模块? – MKesper

+0

我总是使用os.walk和os.list遍历文件而不是glob模块。我正在查看glob模块的用法。@ MKesper – Cobin

回答

0

这将做

import os 

path = "your\\path" 

all_files = [x for x in os.listdir(path) if os.path.isfile(path + "\\" + x)] 

for year in range(2000, 2017): 
    for file_name in [y for y in all_files if str(year) in y]: 
     sub_file_path = path + "\\" + file_name 
     # read file, insert appropriate code yourself 
+1

也许使用os.path而不是手动加入路径?我们不知道OP的操作系统。 – MKesper

0

你可以找到和组文件使用os.listdir(),与re正则表达式模块一起处理,并itertools.groupby()功能做的东西沿着这些路线:

from itertools import groupby 
import os 
import re 

folder_path = 'data_folder' 

pattern = r'm\d\d\d\d_\d\d' 
filenames = [filename for filename in sorted(os.listdir(folder_path)) 
       if re.match(pattern, filename)] 

for k, g in groupby(filenames, lambda filename: filename.split('_')[0]): 
    year = int(k[1:]) 
    year_files = list(g) 
    print('{}: {}'.format(year, year_files)) 

取样输出:

2000: ['m2000_01', 'm2000_02', 'm2000_03', 'm2000_04', 'm2000_05', 'm2000_06', 'm2000_07', 'm2000_08', 'm2000_09', 'm2000_10', 'm2000_11', 'm2000_12'] 
2001: ['m2001_01', 'm2001_02', 'm2001_03', 'm2001_04', 'm2001_05', 'm2001_06', 'm2001_07', 'm2001_08', 'm2001_09', 'm2001_10', 'm2001_11', 'm2001_12'] 
2002: ['m2002_01', 'm2002_02', 'm2002_03', 'm2002_04', 'm2002_05', 'm2002_06', 'm2002_07', 'm2002_08', 'm2002_09', 'm2002_10', 'm2002_11', 'm2002_12'] 
+0

我不确定什么是正则表达式更具可读性,就像你拥有它或类似的东西一样:'r'm \ d {4} _ \ d {2}' – Baldrickk

+0

@Baldrickk:在少于5次重复的情况下,我通常只是拼出来 - 大约相同数量的键入和等同可读的IMO,其中4是一个边缘情况... – martineau