我得到了一个example.txt文件,其中包含:
4-1
9-3
作为书面格式,字符串类型。我需要打开文件,读取行,执行操作并重写文件,以便:
4-1=3
9-3=6
但是在尝试转换时,我经常会遇到一个错误,我认为问题是-
符号,它不会删除它,当我做f.readlines
来得到它,就像列表中有['4-1\n', '9-3\n']
。我设法剥去了\n
符号。
到目前为止我的代码是:
with open('./izrazi.txt', 'r+') as f:
lst = f.readlines()
print(lst)
first = lst[0]
first = first.strip('\n')
print(first)
print(first.isdigit())
我试图转换为set
,然后删除-
,然后我将它转换回list
,只有2个元素,但是每次运行代码之后,它们都会更改索引位置,因此我无法减去。
发布于 2020-11-14 14:15:28
eval
在行上执行数学操作。
with open('./izrazi.txt', 'r+') as f:
lst = f.readlines()
[f.write(i.strip('\n') + '=' + str(eval(i)) + '\n') for i in lst]
发布于 2020-11-14 14:15:45
我想..。像这样的事情会做好你的工作。
f = open('./izrazi.txt', 'r+')
text = f.readlines()
f.close()
f = open('./izrazi.txt', 'w+')
for line in text:
res=eval(line)
out=line.strip('\n') + '=' + str(res) + '\n'
f.write(out)
f.close()
发布于 2020-11-14 15:28:06
eval()
肯定会做到这一点,但是有一个school of thought是最好避免使用eval()
的,所以我将介绍一个使用正则表达式的替代方法。
尝试使用像split()
这样的Python函数变得非常困难,因为您只能在一个字符上拆分。正则表达式将使您能够更容易地找到方程的组成部分。例如,这个正则表达式:
r'(\d+\.?\d*)([\-+/*])(\d+\.?\d*)'
专门查找三个组(括号内):
(\d+\.?\d*)
查找一个带有或不带小数位的数字。
([\-+/*])
寻找数学符号
所以,他们会同时找到数字和你指定的任何数学符号。
matches[0]
包含所有匹配组的组合,matches1,2,3包含第一个值、操作符和第二个值。
这使您可以不使用eval()
执行计算。
import re
with open('./izrazi.txt', 'r+') as f:
lst = f.readlines()
with open('./izrazi2.txt', 'w+') as f:
for line in lst:
matches = re.match(r'(\d+\.?\d*)([\-+/*])(\d+\.?\d*)', line)
if matches:
if matches[2] == "-":
calc = float(matches[1]) - float(matches[3])
if matches[2] == "+":
calc = float(matches[1]) + float(matches[3])
if matches[2] == "/":
calc = float(matches[1]) / float(matches[3])
if matches[2] == "*":
calc = float(matches[1]) * float(matches[3])
f.write(f"{matches[0]}={calc:g}\n")
输入如下:
4-2
9-3
3.142/22
34.2*91.44
9-3
3.142/22
34.2*91.4
这确实提供了以下方面的预期产出:
4-2=2
9-3=6
3.142/22=0.142818
34.2*91.44=3127.25
9-3=6
3.142/22=0.142818
34.2*91.4=3125.88
顺便说一下,您不能将set
用于诸如-
和/
这样的操作,因为它们不是可交换的。A set
object is an unordered collection of distinct, hashable objects,所以它根本不适合与数学术语一起使用。
https://stackoverflow.com/questions/64834617
复制相似问题