#python
Вопрос:
Я пытаюсь написать функцию входа в систему с помощью python. Однако я, похоже, не могу написать код для проверки имени пользователя и пароля на соответствие тем, которые хранятся в файле. Конкретная ошибка-ошибка имени: имя «adusername» не определено. Как мне это исправить?
def adminlogindetails():
adusername = input("Admin Username: ")
adpassword = input("Admin Password: ")
adfile = open("adlogindetails.txt", "a")
adfile.write(adusername)
adfile.write(",")
adfile.write(adpassword)
adfile.write("n")
adfile.close()
def adminverification():
adun = input("Enter your username:")
adpw = input("Enter your password:")
adinfo = open("adlogindetails.txt", "r")
for line in adinfo:
adun, adpw = line.split(",")
if adun == adusername and adpw == adpassword:
print("Login successful!")
adminoptions()
else:
print("Incorrect username/password")
roleselection()
adminverification()
Комментарии:
1. Когда вы звоните
adminverification
, вы сначала не объявляетеadusername
илиadpassword
.2. Также ты никогда не звонишь
adminlogindetails
3. измените две первые строки на
adminverification
adusername = input("Enter your username:") adpassword = input("Enter your password:")
4. Вы, кажется, путаетесь в области переменных. Переменная, определенная внутри a
def
, не видна вне ее. Как только вы узнаете, как это работает, исправление должно быть очевидным и тривиальным; определите переменную, которую вы пытаетесь использовать.5. Я вижу 2 ошибки: adun, adpw = line.split («,»), а также цикл for примет решение на первой итерации
Ответ №1:
Вы не заявили adusername
и adpassword
в adminverification()
. Итак, это вызывает ошибку. Если вы хотите использовать переменные из adminlogindetails()
, измените имя переменных, так как вы сохранили сведения в adlogindetails.txt
.
Приведенный ниже код следует изменить, так как line
переменная содержит уже сохраненные имя пользователя и пароль:
adun, adpw = line.split(",")
Измените приведенный выше фрагмент кода на приведенный ниже:
adusername, adpassword = line.split(",")
вы можете использовать это:
def adminlogindetails():
adusername = input("Admin Username: ")
adpassword = input("Admin Password: ")
adfile = open("adlogindetails.txt", "a")
adfile.writelines(adusername ',' adpassword )
adfile.close()
def adminverification():
adun = input("Enter your username:").strip()
adpw = input("Enter your password:").strip()
with open("adlogindetails.txt", "r") as f:
lines = f.readlines()
i = 0
for line in lines:
adusername, adpassword= line.split(",")
adusername = str(adusername).strip()
adpassword = str(adpassword).strip()
if (adun == adusername) and (adpw == adpassword):
print("Login successful!()")
adminoptions()
break
else:
i = 1
if i >= len(lines): #If no any match upto last line, this will be true
print("Incorrect username/password")
roleselection()
break
adminverification()
Комментарии:
1. спасибо за всю помощь, я исправил это соответствующим образом. Но теперь, когда я ввожу правильное имя и пароль, появляются результаты, соответствующие критериям (adminoptions()) и не соответствующие критериям (выбор ролей()). как мне это исправить?
2. Попробуйте распечатать
adusername
иadpassword
перед печатьюlogin successful
. Также печатайтеadusername
иadpassword
перед печатьюIncorrect username/password
. Можете ли вы подробнее рассказать, с какой проблемой вы столкнулись сейчас, обновив свой основной вопрос?3. когда я ввожу правильное имя пользователя и пароль, результатом является «Вход успешен!», за которым следует результат adminoptions (), а прямо под ним «Неправильное имя пользователя/пароль» и результат выбора ролей (). в основном появляются оба результата для true и false
4. В вашем коде есть некоторые логические проблемы. Он проверит только первую строку файла и решит, соответствует ли она или нет.
5. в моем файле у меня есть 2 строки для 2 имен пользователей и паролей. перерыв решает проблему, когда я ввожу первое имя пользователя и пароль. но если я введу его во 2-й строке, он вернет ложный результат
Ответ №2:
Во-первых, вы не звоните adminlogindetails()
.
Также adusername
является локальной переменной, и вы должны либо сделать ее глобальной, используя global adusername
в adminlogindetails
функции, либо объявить ее вне функций в глобальной области.
Видишь это — https://www.w3schools.com/python/python_scope.asp
Ответ №3:
Эта строка-ваша проблема:
adun, adpw = line.split(",")
«adun» и «adpw» — это ваши входные данные, и вы их перезаписываете. Замените это, и все будет в порядке:
adusername, adpassword = line.replace("n", "").split(",")
Примечание: «n» необходимо удалить, чтобы ваше сравнение было в порядке.