Почему моя программа Python не может прочитать вторую строку моего файла данных? - PullRequest
0 голосов
/ 06 августа 2020

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

Программа выполняет следующие действия:

  • Спрашивает, был ли у вас уже профиль.
  • Если нет, то просит создать логин и пароль. Информация сохраняется в текстовом файле.
  • Если да, то просит ввести ваш пароль и имя пользователя.

Когда у пользователя нет профиля, все работает нормально. Когда у пользователя есть профиль и он хочет войти в систему, он не работает, и я не знаю почему.

Имя пользователя сохраняется в первой строке текстового файла, а пароль - во второй строке , поэтому я использую readlines () [0] и readlines () [1].

Имя пользователя распознается правильно, а пароль - нет. Я получаю эту ошибку

Traceback (most recent call last):
  File "Archivo de prueba.py", line 4, in <module>
    print(text_file.readlines()[1])
IndexError: list index out of range

Это код, который я написал:

text_file = open("Archivo de prueba.txt", "r+")
    
def ask_for_account():
  global has_account
  has_account = input("Do you have an account? (Write \"Yes\" or \"No) ")
  ask_for_account()

def create_profile():
  create_user = str(input("Type your new username: "))
  create_password = str(input("Type your new password: "))
  text_file.write(create_user)
  text_file.write("\n")
  text_file.write(create_password)
    
def login():
  username = text_file.readlines()[0]
  password = text_file.readlines()[1]
  current_user = input("Type your username: ")
  current_password = input("Type your password: ")
  if str(current_user) == str(username) and str(current_password) == str(password):
    print("Succesfully logged in.")
  else:
    print("Invalid username or password")
    
if has_account == "No":
  create_profile()
elif has_account == "Yes":
  login()
else:
  print("Invalid input")
  ask_for_account()
    
text_file.close()

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Работает следующий код. Я добавил несколько комментариев, чтобы указать на изменения.

def ask_for_account():
  return input("Do you have an account? (Enter 'Yes' or 'No') ")

def create_profile():
  create_user = str(input("Type your new username: "))
  create_password = str(input("Type your new password: "))
  # Open the file for writing and close it after use.
  text_file = open("Archivo de prueba.txt", "w")
  text_file.write("{}\n".format(create_user))
  text_file.write("{}\n".format(create_password))
  text_file.close()

def login():
  # Open the file for reading and close it after use.
  text_file = open("Archivo de prueba.txt", "r")
  lines = text_file.readlines()
  text_file.close()
  # remove the newline at the end of the input lines.
  username = lines[0].rstrip()
  password = lines[1].rstrip()
  current_user = input("Type your username: ")
  current_password = input("Type your password: ")
  if current_user == username and current_password == password:
    print("Succesfully logged in.")
  else:
    print("Invalid username or password")

#
# Put program logic in one place after the methods are defined.
#
has_account = ask_for_account()
if has_account == "No":
  create_profile()
elif has_account == "Yes":
  login()
else:
  print("Invalid input")
0 голосов
/ 06 августа 2020
username = text_file.readlines()[0]
password = text_file.readlines()[1]

Первый вызов readlines() потребляет весь файл, и для второго вызова не остается строк для чтения, поэтому он возвращает пустой список.

Прочтите файл один раз и сохраните строки в списке, затем выберите нужные строки из списка:

file_lines = text_file.readlines()
username = file_lines[0]
password = file_lines[1]

Также имейте в виду, что readlines() помещает возврат каретки \n в конец каждой строки , поэтому вам, возможно, придется отключить это в зависимости от того, как вы используете эти значения.

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