Python 如何逐组循环读取文件?
通常,我在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
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是一个边缘案例。。。