J'ai un fichier example.txt , qui contient:
with open('./izrazi.txt', 'r+') as f: lst = f.readlines() print(lst) first = lst[0] first = first.strip('\n') print(first) print(first.isdigit())
comme format écrit, type de chaîne. Je dois ouvrir le fichier et lire des lignes, effectuer une opération et réécrire le fichier dans:
4-1=3 9-3=6
Mais j'obtiens constamment une erreur en essayant la conversion, le problème que je pense est le symbole -
, et il ne le f.readlines
pas, quand je fais f.readlines
pour l'obtenir sous forme de liste ['4-1\n', '9-3\n']
. J'ai réussi à retirer le symbole \n
.
Mon code jusqu'à présent:
4-1 9-3
J'ai essayé de convertir en un set
et de supprimer -
, après cela, je l'ai reconverti en list
et il n'y a que 2 éléments, mais après chaque exécution de code, ils changent de position d'index, et je ne peux donc pas soustraire.
3 Réponses :
eval
effectue une opération mathématique sur la ligne
with open('./izrazi.txt', 'r+') as f: lst = f.readlines() [f.write(i.strip('\n') + '=' + str(eval(i)) + '\n') for i in lst]
Je pense que ... quelque chose comme ça fera ton travail.
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()
eval()
fera certainement l'affaire, mais il existe une école de pensée selon laquelle il vaut mieux éviter d'utiliser eval()
, je vais donc présenter une alternative utilisant des expressions régulières.
Essayer d'utiliser des fonctions Python comme split()
devient assez rapidement délicat car vous ne pouvez diviser que sur un seul caractère. Les expressions régulières vous permettraient de trouver plus facilement les composants de l'équation. Par exemple cette expression régulière:
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
recherche spécifiquement 3 groupes (entre parenthèses):
(\d+\.?\d*)
recherche un nombre, avec ou sans décimale
([\-+/*])
recherche un symbole mathématique
ainsi, ensemble, ils trouveront les deux nombres et tout symbole mathématique que vous spécifiez.
matches[0]
contient la combinaison de tous les groupes de correspondance et matches [1], [2], [3] contiennent la première valeur, l'opérateur et la seconde valeur.
Cela vous permet d'effectuer les calculs sans utiliser eval()
4-2 9-3 3.142/22 34.2*91.44 9-3 3.142/22 34.2*91.4
Avec une entrée de:
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")
Cela donne la sortie souhaitée de:
r'(\d+\.?\d*)([\-+/*])(\d+\.?\d*)'
En passant, vous ne pouvez pas utiliser un set
pour des opérations telles que -
et /
car elles ne sont pas commutatives. Un objet set
est une collection non ordonnée d'objets distincts et hachables , il n'est donc tout simplement pas approprié pour une utilisation avec des termes mathématiques.
Bienvenue sur le site. Partagez votre code pour le convertir en set, etc. Montrez-nous ce que vous avez essayé.
a-t-on répondu à votre question?