用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
模块在这种情况下不起作用,因为它不会“并行”读取这些行,因为我需要在这里,但它会“串行”读取这些行。任何指导或建议,高度赞赏。
答
在文本文件的情况下,试试这个:
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。
你的文件有多大?你能把它们全部读入内存,处理它们,然后写出结果吗? – 2010-11-11 21:50:03
@ Space_C0wb0y来自问题 - *我的实际文件当然大于目前的文件大小,大小为Mb。* – 2010-11-11 21:51:52