用Python计算多个文件的记录平均值

用Python计算多个文件的记录平均值

问题描述:

亲爱的全部,
我是Python的初学者。我正在寻找在Python中执行以下操作的最佳方法:假设我有三个文本文件,每个文本文件有m行和n列数字,名称文件A,B和C.以下内容可以是索引为A[i][j]B[k][l]等。我需要计算A[0][0],B[0][0], C[0][0]的平均值,并将其写入文件D D[0][0]。剩下的记录也一样。例如,让我们假设:用Python计算多个文件的记录平均值

A: 
1 2 3 
4 5 6 
B: 
0 1 3 
2 4 5 
C: 
2 5 6 
1 1 1 

因此,文件d应该是

D: 
1  2.67 4  
2.33 3.33 4 

我的实际文件是比现在的人当然更大,一些MB的顺序。如果读取由文件名索引的嵌套结构中的所有文件内容,或者尝试读取每个文件,每行并计算平均值,我不确定最佳解决方案。在阅读本手册后,fileinput模块在这种情况下不起作用,因为它不会“并行”读取这些行,因为我需要在这里,但它会“串行”读取这些行。任何指导或建议,高度赞赏。

+0

你的文件有多大?你能把它们全部读入内存,处理它们,然后写出结果吗? – 2010-11-11 21:50:03

+0

@ Space_C0wb0y来自问题 - *我的实际文件当然大于目前的文件大小,大小为Mb。* – 2010-11-11 21:51:52

看看numpy。它可以将三个文件读入三个数组(使用fromfile),计算平均值并将其导出到文本文件(使用tofile)。

import numpy as np 


a = np.fromfile('A.csv', dtype=np.int) 
b = np.fromfile('B.csv', dtype=np.int) 
c = np.fromfile('C.csv', dtype=np.int) 

d = (a + b + c)/3.0 

d.tofile('D.csv') 

“一些MB”的大小不应该是一个问题。

+0

感谢您的帮助!这是我想要利用的python的力量!我刚刚尝试过np.fromfile函数,但它没有正确读取数字。看来更好的选择是函数np.loadtext(我的文件只是txt文件)。再次感谢。 – iluvatar 2010-11-11 22:10:01

+0

@ user505047 - 你说得对,fromtxt是正确的选择。我很高兴你喜欢发现numpy。当像这里一样操作大数值数组时,它可以节省很多头痛和时间。 – eumiro 2010-11-12 05:33:54

在文本文件的情况下,试试这个:

def readdat(data,sep=','): 
    step1 = data.split('\n') 
    step2 = [] 
    for index in step1: 
     step2.append(float(index.split(sep))) 
    return step2 

def formatdat(data,sep=','): 
    step1 = [] 
    for index in data: 
     step1.append(sep.join(str(data))) 
    return '\n'.join(step1) 

,然后使用这些功能的文本格式列表。

仅供参考,这里是你会怎么做同样的事情,而不numpy的(不太优雅,但更灵活):

files = zip(open("A.dat"), open("B.dat"), open("C.dat")) 
outfile = open("D.dat","w") 
for rowgrp in files:  # e.g.("1 2 3\n", "0 1 3\n", "2 5 6\n") 
    intsbyfile = [[int(a) for a in row.strip().split()] for row in rowgrp] 
         # [[1,2,3], [0,1,3], [2,5,6]] 
    intgrps = zip(*intsbyfile) # [(1,0,2), (2,1,5), (3,3,6)] 
    # use float() to ensure we get true division in Python 2. 
    averages = [float(sum(intgrp))/len(intgrp) for intgrp in intgrps] 
    outfile.write(" ".join(str(a) for a in averages) + "\n") 

在Python 3,拉链将只读取这些文件,因为它们是需要。在Python 2中,如果它们太大而无法加载到内存中,请改用itertools.izip。