0
votes

Impossible d'isoler les éléments de chaîne à convertir et terminer l'ajout

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.


2 commentaires

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?


3 Réponses :


0
votes

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]


0 commentaires

0
votes

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()


0 commentaires

0
votes

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.


0 commentaires