从python中的.txt文件验证用户名/ pswd - 不需要的循环

时间:2017-12-02 20:03:15

标签: python passwords username

passwordAttemptLoop = 0
    print("You have chosen to login!\n")
    while passwordAttemptLoop == 0:
        usernameAttempt = input("Please print your username below\n")
        passwordAttempt = input("Please print your password below\n")
        for line in open("usrnmPswd.txt","r").readlines():
            loginDetails = line.split()
            if usernameAttempt == loginDetails[0] and passwordAttempt == 
loginDetails[1]:
                passwordAttemptLoop = passwordAttemptLoop + 1
                startQuiz()
            else:
                print("Your username and/ or password is incorrect! Please 
try again!")

上面显示的代码是我正在尝试创建的测验程序的登录系统。它用于读取usrnmPswd.txt文件的行(列)(存储用户名/密码的位置)。如果用户名/密码正确,则应通过调用函数startQuiz()开始测验。如果用户名和/或密码不正确,它将告诉用户它不正确并要求他们再次输入用户名/密码(由于while循环)。我对这段代码有两个问题:

1)如果用户名/密码正确,输出如下: https://imgur.com/oQW1Z5i

我认为这是检查每一行并打印错误的usrnm / pswd消息,直到它到达用户名和密码都正确的行。

2)同样,如果用户名和/或密码不正确,我得到的输出如下: https://imgur.com/Buwdw4z

我理解问题是用户名/密码验证的循环,但由于我是初学程序员,我不知道使用什么代码来修复它。

如果您知道如何只打印一次错误的用户名/密码消息,那么任何帮助/代码都将非常受欢迎。感谢

2 个答案:

答案 0 :(得分:0)

如果希望代码按照预期的方式工作,则需要进行一些更改。你做错了几件事

  1. 您的输出会显示错误消息,直到您找到正确的凭据集,因为您正在检查文件每一行的用户名和密码

    usernameAttempt == loginDetails[0] and passwordAttempt == loginDetails[1]

    每次上述条件失败时,它将自动转到else块并执行那些语句

  2. 以下声明在您的程序中无用

    passwordAttemptLoop = passwordAttemptLoop + 1

    您正在为用户提供与文本文件中一样多的尝试,这是一种不好的做法。因此,限制用户在退出程序之前可以尝试的最大尝试次数。每当用户输入一组错误的凭据时,请减小passwordAttemptLoop

  3. 的值
  4. 用户成功登录后,将调用startQuiz()功能。但是一旦执行login()后控制再次返回startQuiz()函数,它将继续执行该程序的其余部分,而这不是您的意图

  5. 此外,根据usrnmPswd.txt文件,您可以忽略文件的前两行,因为它们是文件的标题

  6. 我修改了代码以纠正上述错误

    def login():
    
        passwordAttemptLoop = 3 #attempts you want to give the user
        print("You have chosen to login!\n")
    
        while passwordAttemptLoop > 0:
            usernameAttempt = input("Please print your username below\n")
            passwordAttempt = input("Please print your password below\n")
    
            for line in open("usrnmPswd.txt","r").readlines()[2:]:
                loginDetails = line.split()
                if usernameAttempt == loginDetails[0] and passwordAttempt == loginDetails[1]:
                    startQuiz()
                    return
    
            print("Your username and/ or password is incorrect! Please try again!")
            passwordAttemptLoop = passwordAttemptLoop - 1
    
        print('You are out of login attempts. Please try again later')
    

答案 1 :(得分:0)

你猜对了。它逐行读取,直到找到与用户名匹配的行。 readlines逐行阅读。而是使用searchfile

试试这个:

#Login Function      
def login():
        passwordAttemptLoop = 0
        print("You have chosen to login!\n")
        while passwordAttemptLoop == 0:
            usernameAttempt = input("Please print your username below\n")
            passwordAttempt = input("Please print your password below\n")

            searchfile = open("usrnmPswd.txt", "r")
            for line in searchfile:
                if usernameAttempt in line: 
                    loginDetails = line.split()
                    if usernameAttempt == loginDetails[0] and passwordAttempt == loginDetails[1]:
                        passwordAttemptLoop = passwordAttemptLoop + 1
                        startQuiz()
                        searchfile.close()
                    else:
                        print("Your username and/ or password is incorrect! Please try again!")


#MAIN/START MENU Function
  • searchfile读取文件并查找包含'用户名'由用户传递并返回它。然后,您可以在该行上进行操作。

  • 您应该保留允许的最大尝试次数,并在收到最大允许尝试的情况下提供与管理员联系的消息或类似的相应消息。否则,如果他/她实际忘记了密码,那么尝试登录的人将永远停留在此步骤