与用户输入相比,用户登录从文件中读取失败

User login read from file failing compared to user input

我正在编写一个程序来验证用户名:

def user_login():
    """ Login and create a username, maybe """
    with open('username.txt', 'r') as f:
        if f.readline() is "":
            username = raw_input("First login, enter a username to use: ")
            with open('username.txt', 'a+') as user:
                user.write(username)
        else:
            login_id = raw_input("Enter username: ")
            if login_id == str(f.readline()):
                return True
            else:
                print "Invalid username."
                return False


if __name__ == '__main__':
    if user_login() is not True:
        print "Failed to verify"

每次我运行它输出如下:

Enter username: tperkins91
Invalid username.
Failed to verify

如何将用户输入与从文件中读取进行比较?

在另一个嵌套上下文中再次打开同一个文件不是一个好主意。相反,在 append 模式下打开文件一次,并在需要时使用 f.seek(0) 到 return 开始:

def user_login():
    """ Login and create a username, maybe """
    with open('username.txt', 'a+') as f:
        if f.readline() is "":
            username = raw_input("First login, enter a username to use: ")
            f.seek(0)
            f.write(username)
            # return True/False --> make the function return a bool in this branch
        else:
            login_id = raw_input("Enter username: ")
            f.seek(0)
            if login_id == f.readline():
                return True
            else:
                print "Invalid username."
                return False


if __name__ == '__main__':
    if user_login() is not True:
        print "Failed to verify" 

您可能需要考虑在 if 分支中返回布尔值,因此函数的 return 类型与布尔值一致,而不是 None当前情况。

第一次使用readline()时,当前文件位置移过第一条记录。查找文件是否为空的更好方法是测试它的大小:

import os.path
import sys

def user_login():
    fname = 'username.txt'

    """ Login and create a username, maybe """
    if os.path.getsize(fname) == 0:

        with open(fname, 'w') as f:
            username = raw_input("First login, enter a username to use: ")
            f.write(username)
            return True    #/False --> make the function return a bool in this branch
    else:
        with open(fname, 'r') as f:
            login_id = raw_input("Enter username: ")
            if login_id == f.readline().rstrip():
                return True
            else:
                print >>sys.stderr, "Invalid username."
                return False


if __name__ == '__main__':
    if user_login() is not True:
        print "Failed to verify"

f.readline() 将包含尾随换行符(如果文件中有换行符),而 raw_input() 则不会。虽然我们没有明确写一个,但有人可能会无意中编辑文件并添加换行符,因此添加 rstrip() 作为防御措施。