Python: сумма чисел в разных файлах - PullRequest
1 голос
/ 08 апреля 2019

Я знаю, что у моей проблемы уже есть решение, но это не совсем то, что мне нужно в других предметах.Итак, вот оно:
У меня есть 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 7099

Пока что я хотел написать каждую строку в разных файлах, но это заняло бы так много места ...

Я не уверен, как я могу это сделатьтот.Если у кого-нибудь есть предложение, я открыт для него.Спасибо

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Сначала вы можете загрузить один файл, чтобы получить структуру файла (ов).Это также повлияет на случай, когда не все строки имеют одинаковое количество наблюдений.Затем, основываясь на структуре, вы добавляете отдельные значения для всех файлов и строк.

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())]
2 голосов
/ 08 апреля 2019

Использование numpy

Ex:

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]
2 голосов
/ 08 апреля 2019

Предполагая, что вы заранее знаете формат файла и имеете список имен файлов, вы просто перебираете файлы и накапливаете суммы в списке списков нужного размера:

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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...