0
votes

PYTHON: l'instruction IF avec les paramètres d'un fichier ne fonctionne pas correctement

Je crée un programme permettant à l'utilisateur de définir les chances d'un bon lancer. La variable est stockée dans un fichier afin qu'elle puisse être utilisée même lorsque vous fermez le programme. Mon problème est que seul le premier état de l'instruction if est exécuté et je ne peux pas comprendre pourquoi.

file = open("rolltype.txt", "r")
user = input("Enter what you want to roll[e.x: 2d8]: ")
if file.readline() == "1":
    print("Favor")
    favor(user)
elif file.readline() == "2":
    print("AGAINST")
    against(user)
elif file.readline() == "3" or file.readline() == None:
    print("NEUTRAL")
    check(user)
file.close()

J'ouvre le fichier en mode lecture et dans le if instruction Je vérifie 4 scénarios possibles et j'appelle la fonction appropriée. Si le fichier contient la valeur 1 alors le programme s'exécute correctement, et sinon, les elifs sont sautés dessus.

Note d'accompagnement: le print () à l'intérieur du si sont utilisés pour le débogage. Merci d'avoir pris le temps de lire et d'essayer peut-être d'aider. Bonne fin de journée!


2 commentaires

tmp = file.readline () puis utilisez si "1" dans tmp , si "2" dans tmp , etc.


chaque fois que readline () est exécuté, le pointeur est déplacé sur la ligne suivante, par conséquent, vous ne devez appeler readline () qu'une seule fois.


5 Réponses :


3
votes

Chaque fois que vous appelez file.readline () , il lit la ligne suivante du fichier.

Par conséquent, vous obtiendrez un résultat différent pour chaque expression conditionnelle.

Pour résoudre ce problème, vous devez simplement stocker la valeur dans une variable et vérifier cela dans vos expressions conditionnelles:

user = input("Enter what you want to roll[e.x: 2d8]: ")
value = file.readline()

if value == "1":
    print("Favor")
    favor(user)
elif value == "2":
    print("AGAINST")
    against(user)
elif value == "3" or value == None:
    print("NEUTRAL")
    check(user)
file.close()


0 commentaires

2
votes

Chaque fois que vous appelez file.readline () , il lit une nouvelle ligne dans le fichier. Cela peut être résolu en l'assignant à une variable avant les instructions if.

line = file.readline()
if line == "1":
  print("Favor")
elif line == "2":
  print("Against")
elif line == "3":
  print("Nuetral")

Cependant, je ne pense pas que readline supprime toujours les espaces de fin. Par conséquent, je suggère d'utiliser file.readline().strip().


0 commentaires

4
votes

Il y a deux problèmes avec votre code.

  • readline () sur un fichier inclut la nouvelle ligne à la fin de la ligne. Il ne correspondra jamais à "1" ou à toute autre chaîne qui ne se termine pas par une nouvelle ligne.
  • Vous comparez une ligne différente à chaque fois en raison des multiples appels à readline () . Chaque fois que readline () est exécuté, le pointeur est déplacé sur la ligne suivante. Si le fichier ne contient pas suffisamment de lignes, certaines d'entre elles renverront la chaîne vide et ne correspondront à rien non plus.

Solution: appelez readline () une fois dans une variable et utilisez strip () pour supprimer la nouvelle ligne (et tout autre espace). p>

num_from_file = readline().strip()
if num_from_file == "1":


0 commentaires

1
votes

Je ne suis pas sûr de comprendre votre problème, mais je rencontre déjà quelque chose de similaire. C'était parce que l'utilisation de readline () plusieurs fois. Ne pouvez-vous pas simplement utiliser:

fileContent = file.readline()
user = input("Enter what you want to roll[e.x: 2d8]: ")
        if fileContent == "1":
            print("Favor")
            favor(user)
        elif fileContent == "2":
            print("AGAINST")
            against(user)
        elif fileContent == "3" or fileContent == None:
            print("NEUTRAL")
            check(user)
        file.close()

Je ne suis pas sûr de ma réponse car je ne comprends pas comment votre fichier est écrit.


0 commentaires

1
votes

Vous pouvez simplifier votre code en utilisant des dictionnaires pour définir une valeur pour le mappage d'impression print_dct et une valeur pour le mappage de fonction func_dct Vous pouvez également utiliser avec pour ouvrir votre fichier, de sorte que vous n’ayez pas besoin de le fermer explicitement.

user = input("Enter what you want to roll[e.x: 2d8]: ")

print_dct = {"1": "Favor", "2": "AGAINST", "3": "NEUTRAL"}
func_dct = {"1": favor, "2": against, "3": user}


with open("rolltype.txt", "r") as file:
    value = file.readline()

    if value == None:
        print(print_dct['3'])
        check(user)

    elif value in print_dct:
        print(print_dct[value])
        func_dct[value](user)


0 commentaires