【问题标题】:summing up values of columns from multiple files汇总来自多个文件的列的值
【发布时间】:2013-02-05 16:31:41
【问题描述】:

我在这里有一个小问题,我正在尝试总结来自多个文件 (50) 的条目,每个文件包含 3 列。 例如,使用前 3 个文件:file1.txt、file2.txt、file3.txt,它们看起来像:

file1.txt:

2 3 4
1 5 6
5 4 7

file2.txt:

1 2 1
2 3 2
4 3 1

file3.txt:

6 1 1
1 3 0
3 4 5

所以我的问题是如何将 50 个文件中的第一列、第二列和第三列中的所有条目相加,最终得到一个看起来像这样的文件:

输出.txt:

9 6 6
4 11 8
12 11 13

我已经阅读了 50 个文件并附加了它们,但实际上我在逐个汇总条目时遇到了麻烦。

所以我这样做了:

for p in range(50):
    locals()['first_col%d' % p] = []
    locals()['second_col%d' % p] = []
    locals()['third_col%d' % i] = []

for i in range(1,50):
    f = open("file"+str(i)+".txt","r")
    for line in f:
        locals()['fist_col%d' % i].append(float(line.split()[0]))
        locals()['second_col%d' % i].append(float(line.split()[1]))
        locals()['third_col%d' % i].append(float(line.split()[2]))

f.close()

我正在想办法将其放入一个循环中,该循环将读取所有 first_cols(first_col1、first_col2、first_col3 等)、second_cols 和 third_cols 并汇总条目。

【问题讨论】:

  • 不要尝试在运行时构造变量名;使用字典。即first_col[p] = [] 而不是locals()['first_col%d'%p]=[]。此外,locals() 的返回值应视为只读;不保证更改可见。

标签: python


【解决方案1】:
#!/usr/bin/python
b_list = []
for l in range(1,4):
    file=open('/Users/sgeorge/file%i.txt' % l, 'r')
    m1=[(i.strip()) for i in file]
    for j in m1:
        b_list.append(filter(None,[(k.strip()) for k in j]))
#print b_list
a = [[0,0,0],[0,0,0],[0,0,0]]
for i in range(0,9,3):
    a[0][0] += int(b_list[i][0])
    a[0][1] += int(b_list[i][1])
    a[0][2] += int(b_list[i][2])
for i in range(1,9,3):
    a[1][0] += int(b_list[i][0])
    a[1][1] += int(b_list[i][1])
    a[1][2] += int(b_list[i][2])

for i in range(2,9,3):
    a[2][0] += int(b_list[i][0])
    a[2][1] += int(b_list[i][1])
    a[2][2] += int(b_list[i][2])

for j in a:
    print j[0],j[1],j[2]

输出:

$ python stack.py 
9 6 6
4 11 8
12 11 13

上述脚本仅用于处理三个文件(file1.txtfile2.txtfile3.txt

如果您想处理 50 个此类文件,请使用以下命令:

#!/usr/bin/python
b_list = []
for l in range(1,51):
    file=open('/Users/sgeorge/file%i.txt' % l, 'r')
    m1=[(i.strip()) for i in file]
    for j in m1:
        b_list.append(filter(None,[(k.strip()) for k in j]))
#print b_list
a = [[0,0,0],[0,0,0],[0,0,0]]
for i in range(0,150,3):
    a[0][0] += int(b_list[i][0])
    a[0][1] += int(b_list[i][1])
    a[0][2] += int(b_list[i][2])
for i in range(1,150,3):
    a[1][0] += int(b_list[i][0])
    a[1][1] += int(b_list[i][1])
    a[1][2] += int(b_list[i][2])

for i in range(2,150,3):
    a[2][0] += int(b_list[i][0])
    a[2][1] += int(b_list[i][1])
    a[2][2] += int(b_list[i][2])

for j in a:
    print j[0],j[1],j[2]

更新:

>>> a=1
>>> b=1.1
>>> type(a)
<type 'int'>
>>> type(b)
<type 'float'>
>>> float(a)+float(b)
2.1
>>> 

我上面的脚本不能处理floating 号码。对于相同的处理,请使用以下内容:

#!/usr/bin/python
b_list = []
for l in range(1,4):
    file=open('/Users/sgeorge/file%i.txt' % l, 'r')
    m1=[(i.strip()) for i in file]
    for j in m1:
        b_list.append(j.replace('\n','').split(' '))
#print b_list
a = [[0,0,0],[0,0,0],[0,0,0]]
for i in range(0,9,3):
    a[0][0] += float(b_list[i][0])
    a[0][1] += float(b_list[i][1])
    a[0][2] += float(b_list[i][2])
for i in range(1,9,3):
    a[1][0] += float(b_list[i][0])
    a[1][1] += float(b_list[i][1])
    a[1][2] += float(b_list[i][2])
for i in range(2,9,3):
    a[2][0] += float(b_list[i][0])
    a[2][1] += float(b_list[i][1])
    a[2][2] += float(b_list[i][2])
for j in a:
    print j[0],j[1],j[2]

输出:

$ python stack.py 
9.0 6.0 6.0
4.0 11.0 8.0
12.0 11.0 13.0

【讨论】:

  • 谢谢 SUKU。但是如果输入的不是整数,而是浮点数呢?
  • 抱歉错误是:ValueError: could not convert string to float: .
  • 你是伟大的 SUKU,非常感谢!我实际上是在尝试将此应用于更大的问题:100 个文件(file1.txt...file100.txt),每个文件有 2500 行和两列。如果我删除每个 for 循环中的行(即 a[0][2] += float(b_list[i][2]), a[1][2] += float(b_list[i ][2]), a[2][2] += float(b_list[i][2]))?
【解决方案2】:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html 加载到 numpy 数组中,然后对数组求和。

【讨论】:

    【解决方案3】:
    In [1]: import numpy as np
    
    In [2]: from StringIO import StringIO
    
    In [3]: txt ="""2 3 4
       ...: 1 5 6
       ...: 5 4 7"""
    
    In [4]: f = StringIO(txt)
    
    In [5]: arr = np.loadtxt(f,dtype = int)
    
    In [6]: np.sum(arr,axis = 0)
    Out[6]: array([ 8, 12, 17])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2018-02-20
      • 1970-01-01
      • 2021-05-04
      • 2017-11-19
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多