如何逐组循环读取文件?

时间:2017-02-16 11:59:28

标签: python

通常,我在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

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

2 个答案:

答案 0 :(得分: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 :(得分: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']