Python: как вычислить сумму чисел из файла?

Как рассчитать сумму чисел из файла .txt?

Данные в файле отформатированы как:

7
8
14
18
16
8
23
...

Я читаю данные из файла и присваиваю значение каждой строки переменной 'line', но я хочу получить что-то вроде: result = 7+8+14+...

f = open('data.txt', 'r')   #LOOP AND READ DATA FROM THE FILE
    for line in f:
        code

person Murphy Adam    schedule 17.08.2018    source источник
comment
Я хочу посчитать сумму всех чисел, 'n' просто говорит, что список можно продолжить, 7+8+14+-19-23...Спасибо.   -  person Murphy Adam    schedule 17.08.2018


Ответы (7)


Будь проще:

with open('data.txt', 'r') as f:
    result = sum(map(int, f))

int отображается на каждую строку из f, затем sum() суммирует полученные целые числа.

person Steven Rumbalski    schedule 17.08.2018
comment
Спасибо, @Стивен Румбилски. Но я получаю эту ошибку и думаю, что это из-за того, что в файле есть несколько строк для цикла: с open('data.txt', 'r') as fin: ^ SyntaxError: недопустимый синтаксис - person Murphy Adam; 17.08.2018
comment
@MurphyAdam: я забыл закрывающую скобку во второй строке. Это было проблемой? Это не будет из-за нескольких строк. sum() управляет итерацией по всем строкам (косвенно путем итерации по результатам map()). - person Steven Rumbalski; 17.08.2018
comment
Румбильский Да, конечно! Не обратил на это внимания. Да, это намного проще и работает как шарм ^^ Еще раз спасибо. - person Murphy Adam; 17.08.2018

Это самый компактный код, который я могу придумать прямо сейчас: (обновлен для обработки n в конце, спасибо, @JonClements!)

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin if line.strip().isnumeric())

Для структуры кода, которая у вас есть, вы также можете пойти на это:

f = open('data.txt', 'r')
ans = 0
for line in f:
    try:
        ans += int(line.strip())
    except ValueError:
        pass

Правка: поскольку путаница с «n» устранена, первый пример может быть таким же простым, как

with open('file.txt', 'r') as fin:
    ans = sum(int(line) for line in fin)

Или даже этот однострочный:

ans = sum(int(line) for line in open('file.txt', 'r'))

Но есть определенные риски при работе с файлами, поэтому настоятельно не рекомендуется.

person Sufian Latif    schedule 17.08.2018
comment
Что происходит с 'n' в конце файла? (и for line in fin достаточно, потому что fin поддерживает итерируемый интерфейс. - person AChampion; 17.08.2018
comment
Не заметил этого! @MurphyAdam Не могли бы вы объяснить? - person Sufian Latif; 17.08.2018
comment
@ 0605002 .readlines() загрузит все строки в память - вам это не нужно для этого, поскольку вы можете просто суммировать каждую строку по мере продвижения ... другая часть заключается в том, что int('n') вызовет исключение ... - person Jon Clements♦; 17.08.2018
comment
Вам также не нужно .strip, так как int в любом случае не учитывает начальные/конечные пробелы... вы можете обойтись просто суммой (int (строка) для строки в плавнике, если line.strip() .isdigit()) (или .isnumeric() в зависимости) - person Jon Clements♦; 17.08.2018
comment
@ACchampion, это то, что я сказал - похоже, что isdigit и isnumeric делают, хотя ... так что это нужно в одном месте ... - person Jon Clements♦; 17.08.2018
comment
@ 0605002 извините - плохо - вам нужно будет снять if чек, иначе ничего не произойдет из-за \n... - person Jon Clements♦; 17.08.2018
comment
@ 0605002 относительно вашего второго примера ... Я бы также сделал это except ValueError, чтобы поймать только наименьшую сумму, с которой должен иметь дело оператор pass ... если происходит прерывание клавиатуры или IOError ... вы должны позволить этому распространиться на что-то, что может справиться с этим вместо того, чтобы проглотить его. - person Jon Clements♦; 17.08.2018
comment
Просто отметим, что ОП пояснил, что n предназначено только для обозначения продолжения, похоже, это просто список чисел, поэтому вы можете упростить обратно до sum(int(line) for line in f) - person AChampion; 17.08.2018

file = open("data.txt", "r")
numbers = []

for line in file:
  numbers.append(int(line))

print(sum(numbers))

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

person emsimpson92    schedule 17.08.2018
comment
Вы имеете в виду int(line) это не C. - person AChampion; 17.08.2018
comment
Да! Извините, мои основные языки — C и C#. - person emsimpson92; 17.08.2018
comment
Это правильно. ОП не указал, как обращаться с этой частью. Использование if line.IsNumeric(): может быть здесь потенциальным решением. - person emsimpson92; 17.08.2018

Простое решение заключается в том, что оно также позаботится о \n в конце каждой строки, основываясь на предложении Стивена и АЧампа.

with open("abc.txt","r")as f:
    print(sum(int(x) for x in f))
person Inder    schedule 17.08.2018
comment
@StevenRumbalski абсолютно правильно обновляет мой ответ - person Inder; 17.08.2018
comment
Благодарю вас! Это именно то, что мне нужно, @Inder очень признателен. - person Murphy Adam; 17.08.2018
comment
for x in f достаточно. Файлоподобные объекты поддерживают итерируемый интерфейс. Это может быть написано print(sum(map(int, f))) - person AChampion; 17.08.2018
comment
@MurphyAdam рад, что могу помочь :) - person Inder; 17.08.2018
comment
@AChampion, спасибо за предложение внести изменения с должным уважением :) - person Inder; 17.08.2018

Вот решение (считайте, что все строки являются числами):

def calculate_number_in_file(file_path):
    with open(file_path, 'r') as f:
        return sum([int(number.strip()) for number in f.readlines()])
person Yuval Pruss    schedule 17.08.2018

На смартфоне...

with open(filepath) as f:
    lines = f.readlines()
numbers = [int(line) for line in lines]
print(sum(numbers))
person Martin Thoma    schedule 17.08.2018
comment
Спасибо, я не был уверен в этом. А с автозаменой пришлось немало повозиться^^ - person Martin Thoma; 17.08.2018

person    schedule
comment
Нет необходимости читать в data. Просто сделайте все это под своим оператором with: for line in f: .... Также нет необходимости в .strip(), так как int() может обрабатывать начальные и конечные пробелы. - person Steven Rumbalski; 17.08.2018