Python:不同文件中的数字总和

时间:2019-04-08 09:35:24

标签: python file sum

我知道看来我的问题已经有了解决方案,但这不是我在其他学科上需要的。就是这样:
我有200个文件,每个文件有800行。文件的每一行包含800个数字。简而言之,每个文件都具有完全相同的格式。假设,为简单起见,我的文件就是这样的:

文件1:

  

28 56 72 50 01
  65 41 20 18 00

文件2:

  

01 32 09 05 42
  00 23 14 52 99

我需要做的是,将文件中相同位置的数字加起来,这意味着我需要这样的输出文件:

输出:

  

29 88 81 55 43
  65 64 34 70 99

现在,我想做的是将每一行写到不同的文件中,但这会占用很多空间...

我不确定该怎么做。如果有人有任何建议,我愿意接受。谢谢

3 个答案:

答案 0 :(得分:3)

首先,您可以加载一个文件,以获取文件的结构。这也将处理并非所有行都具有相同观察值的情况。然后,根据结构对所有文件和行进行操作,以添加单个值。

further_files = ['file 2']
sums = []
with open('file 1') as file:
    for row in file:
        sums.append(row.split())

for file in further_files:
    with open(file) as open_file:
        for i, row in enumerate(open_file):
            sums[i] = [x + y for x, y in zip(sums[i], row.split())]

答案 1 :(得分:2)

假设您事先知道文件格式并具有文件名列表,则只需遍历文件并将总和累加到大小合适的列表中即可。

nrows, ncols = 2, 5          # 800, 800 in your real code
sums = [[0] * ncols for _ in range(nrows)]

file_names = ["file1.txt", "file2.txt"]
for file_name in file_names:
    with open(file_name) as f:
        for i, row in enumerate(f):
            for j, col in enumerate(row.split()):
                sums[i][j] += int(col)

for row in sums:
    print(*row)
# 29 88 81 55 43
# 65 64 34 70 99

或者使用numpy.loadtxt

import numpy as np

sum(np.loadtxt(file_name, dtype=int) for file_name in file_names)
# array([[ 29,  88,  81,  55,  43],
#        [ 65,  64,  34,  70,  99]])

答案 2 :(得分:2)

使用numpy

例如:

import os
import numpy as np


result = {}
base_path = r"PATH_TO_FILES"
for filename in os.listdir(base_path):               #Iterate each file
    filename = os.path.join(base_path, filename)
    with open(filename) as infile:                   #Open file for read
        for i, line in enumerate(infile):
            if i not in result:
                result[i] = np.array(line.split(), dtype=int)
            else:
                result[i] = result[i] + np.array(line.split(), dtype=int)    #sum lines

for k, v in result.items():
    print(v)

输出:

[29 88 81 55 43]
[65 64 34 70 99]