Простой сценарий входа нескольких пользователей из файла

У меня проблема с моим сценарием входа в Python 3.5.2.

Проблема с моим кодом в том, что только первый пользователь в файле users.txt может пройти авторизацию. Второй и третий пользователи получают сообщение «Неверное имя пользователя/пароль». Что мне здесь не хватает?

Данные в users.txt имеют следующий формат:

Имя|Фамилия|Роль|ID|Имя пользователя|Пароль

Джон|Джонсон|Директор|1|админ|админ

Майк|Мэдсон|Финансовый директор|2|Майк|Майк

Проблема в том, что только Джон входит в систему, и мне нужен Майк.

def check():

    username = str(input("Username: "))
    password = str(input("Password: "))

    f = open("users.txt", "r")
    file_content = f.read()
    users = file_content.split("\n")
    for user in users:
        user_array = user.split("|")
        uname = user_array[4]
        pword = user_array[5]
        if uname == username and pword == password:
            print("Hello " + user_array[1] + ".")
            print("You are logged in as: " + user_array[2] + ".")
            main_menu()
        else:
            print("Wrong username/password.")
            print("Try again!\n\n")
            check()
check()

Спасибо за помощь!


person FrankieD    schedule 15.12.2016    source источник


Ответы (3)


Вся логика была неправильной. Вам нужно что-то вроде этого:

def check():
    # You need to read it only once, not every loop
    users = open("users.txt").read().split("\n")
    for i in range(len(users)): users[i] = users[i].split("|")

    # Now what you want is to loop infinitely
    # until you get correct username/password
    # instead of recursive calling this
    # function over and over again
    while True:
        username = str(input("Username: "))
        password = str(input("Password: "))

        for user in users:
            uname = user[4]
            pword = user[5]

            if uname == username and pword == password:
                print("Hello " + user[1] + ".")
                print("You are logged in as: " + user[2] + ".")
                main_menu()

        # If none of the records matched the input
        print("Wrong username/password.")
        print("Try again!\n\n")

check()
person Organis    schedule 15.12.2016
comment
Я пробовал, но получаю NameError: имя 'xrange' не определено - person FrankieD; 16.12.2016
comment
xrange был переименован в range в python 3, и они убрали функцию xrange. он просто возвращает генератор вместо списка в python 3 - person wpercy; 16.12.2016

Это из-за линии

if uname == username and pword == password:

Поскольку вы запрашиваете у пользователя его имя пользователя и пароль в начале функции, и я предполагаю, что они вводят «admin» и «admin», эта проверка пройдет только для этой комбинации. Вы должны либо включить запросы input в цикл for, либо изменить его структуру, чтобы он работал лучше.

person wpercy    schedule 15.12.2016

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

person Joynul Islam    schedule 15.12.2016