Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何逐组循环读取文件?_Python - Fatal编程技术网

Python 如何逐组循环读取文件?

Python 如何逐组循环读取文件?,python,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

通常,我在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
)是不规则的。有没有解决类似问题的通用方法?我认为有一个行之有效的方法,但我不知道如何描述和搜索。如果这个问题很简单,请原谅。

这样就可以了

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 

您可以使用
os.listdir()
以及
re
regex模块和
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']

您看过glob模块吗?我总是使用os.walk和os.list遍历文件,而不是glob模块。我正在查看glob模块的用法。@mkespermabe是否使用os.path而不是手动连接路径?我们不知道OP的操作系统。我从来都不知道正则表达式的可读性更好,就像你所知道的,或者类似的:
r'm\d{4}\u\d{2}
@Baldrickk:在不到5次的复制中,我通常只会说它的输入量差不多,在我看来可读性也一样,4是一个边缘案例。。。