PYTHON: оператор IF с параметрами из файла не работает правильно - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю программу, в которой пользователь может установить шансы на хороший бросок.Переменная хранится в файле, поэтому ее можно использовать даже при закрытии программы.Моя проблема в том, что выполняется только первое состояние оператора if, и я не могу понять, почему.

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

Я открываю файл в режиме чтения, а в операторе if я проверяю 4 возможныхсценарии, и вызвать соответствующую функцию.Если файл содержит значение 1, то программа выполняется правильно, а если нет, то elifs перепрыгивает.

Примечание: print() внутри if используется для отладки,Спасибо, что нашли время, чтобы прочитать и, возможно, попытаться помочь.Хорошего вам отдыха!

Ответы [ 5 ]

4 голосов
/ 30 апреля 2019

С вашим кодом есть две проблемы.

  • readline() в файле включает в себя символ новой строки в конце строки.Он никогда не будет соответствовать "1" или любой другой строке, которая не заканчивается новой строкой.
  • Вы сравниваете другую строку каждый раз из-за множественных вызовов readline(),Каждый раз, когда выполняется readline(), указатель перемещается на следующую строку.Если в файле недостаточно строк, некоторые из них будут возвращать пустую строку, и она тоже ничего не будет совпадать.

Решение: вызвать readline() один раз в переменную ииспользуйте strip(), чтобы снять символ новой строки (и любые другие пробелы).

num_from_file = readline().strip()
if num_from_file == "1":
3 голосов
/ 30 апреля 2019

Каждый раз, когда вы звоните file.readline(), он читает следующую строку в файле.

Следовательно, вы получите различный результат для каждого условного выражения.

Чтобы решить эту проблему, вы должны просто сохранить значение в переменной и проверить это в ваших условных выражениях:

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()
2 голосов
/ 30 апреля 2019

Каждый раз, когда вы звоните file.readline(), он читает новую строку из файла. Это можно исправить, присвоив его переменной перед операторами if.

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

Однако я не думаю, что readline всегда урезает конечный пробел. Поэтому я предлагаю использовать file.readline().strip().

1 голос
/ 30 апреля 2019

Вы можете упростить свой код, используя словари, чтобы определить значение для отображения отображения print_dct и значение для отображения функции func_dct Также вы можете использовать with, чтобы открыть ваш файл, чтобы вам не пришлось закрывать его явно.


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)
1 голос
/ 30 апреля 2019

Я не уверен, что понимаю вашу проблему, но я уже сталкивался с чем-то похожим. Это было потому, что использование readline () несколько раз. Разве вы не можете просто использовать:

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

Я не уверен в своем ответе, потому что я не понимаю, как пишется ваш файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...