python считывание выражений из текстового файла и вычисление результата

Я новичок, ничего похожего не нашел.
Есть файл calc.txt, в котором хранятся записи вида

120 + 45
23 / 4

то есть A + B, разделённые пробелами.
Операнды — целые числа. Операции — арифметические (включая деление нацело и нахождение остатка).
Напишите программу, которая вычисляет все эти операции и находит сумму их результатов. Пропишите обработку возможных ошибок. Программа не должна завершаться при первой же ошибке, она учитывает все верные строки и выводит найденный ответ.

Я написал такой код, мне сказали eval использовать небезопасно, помогите исправить.

with open('calc.txt') as file_data:
    result = 0
    for line in file_data:
        try:
            result += eval(line)
        except (SyntaxError, TypeError):
            pass
    print('Результат:', result)

Ответы (3 шт):

Автор решения: Degri

Пойдет?


with open('calc.txt', 'r') as f:
    mass = []
    resault = []
    for i in f.readlines():
        mass.append(i.replace('\n', '').split())
    for i in mass:
        try:
            if i[1] == '+':
                resault.append(f'{i[0]} {i[1]} {i[2]} = ' + str(int(i[0]) + int(i[2])))
            elif i[1] == '-':
                resault.append(f'{i[0]} {i[1]} {i[2]} = ' + str(int(i[0]) - int(i[2])))
            elif i[1] == '/':
                resault.append(f'{i[0]} {i[1]} {i[2]} = ' + str(int(i[0]) / int(i[2])))
            elif i[1] == '*':
                resault.append(f'{i[0]} {i[1]} {i[2]} = ' + str(int(i[0]) * int(i[2])))
            elif i[1] == '%':
                resault.append(f'{i[0]} {i[1]} {i[2]} = ' + str(int(i[0]) % int(i[2])))
        except (IndexError, ZeroDivisionError, ValueError) as e:
            print(e)
    print('\nРезультаты:')
    for i in resault:
        print(i)

Тут я считываю с файла строку, и записываю её в массив(удаляя перенос на новую строку), и записываю строку в массив, далее просто сравниваю оператор, если оператор "+" я с первым и вторым числом произвожу соответственное действие

→ Ссылка
Автор решения: Никита

Есть еще такой способ. Он сложнее в понимании, зато проще добавлять новые арефметические опрации.

#Создаем словарь с лямбда-функциями для каждого арефметического действия.
operators = {
    '+':lambda a, b: a + b,
    '-':lambda a, b: a - b,
    '*':lambda a, b: a * b,
    '/':lambda a, b: a / b,
}

with open('calc.txt') as file_data:
    result = 0
    for line in file_data:
        try:
            #Ищем арефметический знак в строке
            for i in operators:
                if i in line:
                    line = line.split(f' {i} ') #Разбиваем пример на два числа
                    result += operators[i](int(line[0]), int(line[1]))
                    break
        except (SyntaxError, TypeError):
            pass
    print('Результат:', result)
→ Ссылка
Автор решения: dtroyan

Примерно так:

with open('calc') as file_data:
    result = 0
    for line in file_data:
        try:
            line = line.replace('\n', '')
            line_item = line.split(' ')
            if line_item[1] == '+':
                result = float(line_item[0])+float(line_item[2])
            elif line_item[1] == '-':
                result = float(line_item[0])-float(line_item[2])
            elif line_item[1] == '*':
                result = float(line_item[0])*float(line_item[2])
            elif line_item[1] == '/':
                result = float(line_item[0])/float(line_item[2])
            else:
                raise ('Знак не распознан')
            print('Результат {0}: {1}'.format(line, result))
        except:
            print('Результат {0}: {1}'.format(line, 'Ошибка'))
→ Ссылка