2017-04-06 38 views
1

我在一个目录中有三个文本文件,其中有两列数据由制表符分隔(\t)。取三个不同文本文件的平均值并编译成一个文件

我想在三个不同的文本文件的同一列取三个数字的平均值。我关心的数字在第二列或在标签之后(在列表中它将在位置1)。然后,我想输出一个文件,其中第1列的所有内容都被复制(它们是相同的文本),第2列是相应行的平均值。

这是我现在有的:我从另一个堆栈溢出问题中得到了这段代码,但它不会遍历3个不同的文件。

谢谢!

import sys 

allfiledata = [] 
filenames = sys.argv[1:] 
for filename in filenames: 
    rows = [] 
    with open (filename, "r") as filehandle: 
    for line in filehandle: 
     rows.append(line.split()) 

    allfiledata.append(rows) 


print " ".join(allfiledata[0][0]) # column headers 
for i1,columns in enumerate(allfiledata[0][1:]): 
    print columns[0], 
    for i2,value in enumerate(columns[1:]): 
    total = 0 
    for filedata in allfiledata: 
     total = int(filedata[i1+1][i2+1]) + total 
    print int(float(total)/len(allfiledata)+0.5), 
    print 

我的文本文件看起来像这样:

FILE1.TXT

AAA  4 
AAB  5 
AAC  0 
AAD  1 

FILE2.TXT

AAA  4 
AAB  5 
AAC  0 
AAD  1 

file3.txt

AAA  4 
AAB  5 
AAC  0 
AAD  1 

注意:这些列表进入千位 我想获得三个不同文件中数字的平均值,它们看起来就像这样,并输出一个带有复制的第一列和数字平均值的文件。

+1

这是一个功课题吗? – tipanverella

+1

不,我是python编程新手(有一些java的经验),我在DNA Seq工作,基本上我已经完成了所有程序的工作,现在在处理文本文件时尝试处理数据时遇到了问题。 –

回答

0
import glob 

files = glob.glob(r'C:\files\*.txt') 

d = {} 
for file in files: 
    with open(file, 'r') as f: 
     for line in f: 
      k, v = line.split() 
      try: 
       d[k].append(int(v)) 
      except KeyError: 
       d[k] = [int(v)] 

with open('results.txt', 'w') as f: 
    for k in sorted(d.keys()): 
     line = '{0}\t{1}\n'.format(k, sum(d[k])/len(d[k])) 
     f.write(line) 

编辑:不要忘了,如果你不使用python3添加from __future__ import division在脚本的第一行代码,并希望得到的结果为浮动。

+0

非常感谢! –

+0

这真的很有帮助!但另一个问题是,如果我的文件标题不断变化,而不仅仅是“file1.txt”,我怎么能做到这一点,所以我运行该程序,并包括一个目录,以找到其中的文本文件? –

+0

您可以使用[glob模块](https://docs.python.org/2/library/glob.html)查找与模式匹配的文件路径。查看更新的答案。 – feqwix

相关问题