Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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_File Io - Fatal编程技术网

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

用python计算多个文件记录的平均值,python,file-io,Python,File Io,亲爱的大家, 我是Python初学者。我正在寻找在Python中执行以下操作的最佳方法:假设我有三个文本文件,每个文件有m行和n列数字,名称文件A、B和C。对于以下内容,可以将其索引为A[I][j],或B[k][l]等等。我需要计算A[0][0],B[0][0],C[0][0]的平均值,并将其写入D[0][0]处的文件D中。其余记录也是如此。例如,让我们假设: A: 1 2 3 4 5 6 B: 0 1 3 2 4 5 C: 2 5 6 1 1 1 因此,文件

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

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
模块在这种情况下没有用处,因为它没有像我在这里需要的那样“并行”读取行,而是“串行”读取行。非常感谢您的指导或建议。

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

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

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


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

如果是文本文件,请尝试以下操作:

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)

然后使用这些函数将文本格式化为列表。

如果是文本文件,请尝试以下操作:

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(不太优雅,但更灵活)的情况下如何完成相同的操作:


在Python3中,zip只在需要时读取文件。在Python 2中,如果它们太大而无法加载到内存中,请改用itertools.izip。

仅供参考,以下是在不使用numpy的情况下如何执行相同的操作(不太优雅,但更灵活):


在Python3中,zip只在需要时读取文件。在Python 2中,如果文件太大而无法加载到内存中,请改用itertools.izip。

文件有多大?你能把它们全部读入内存,进行处理,然后写出结果吗?@Space_C0wb0y从问题中可以看出——我的实际文件当然比现在的文件大,大约有Mb。你的文件有多大?你能把它们全部读入内存,处理它们,然后写出结果吗?@Space_C0wb0y从问题中-我的实际文件当然比现在的文件大,大约Mb。谢谢你的帮助!这就是我想要利用的python的力量!我刚刚尝试了np.fromfile函数,但它没有正确读取数字。似乎更好的替代方法是函数np.loadtext(我的文件只是txt文件)。再次感谢。@user505047-你说得对,fromtxt是正确的选择。我很高兴你喜欢发现numpy。在像这里这样操作大型数值数组时,它可以省去很多麻烦和时间。谢谢你的帮助!这就是我想要利用的python的力量!我刚刚尝试了np.fromfile函数,但它没有正确读取数字。似乎更好的替代方法是函数np.loadtext(我的文件只是txt文件)。再次感谢。@user505047-你说得对,fromtxt是正确的选择。我很高兴你喜欢发现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")