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 шт):
Пойдет?
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)
Примерно так:
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, 'Ошибка'))