一个打印语句输出两次

时间:2019-08-08 03:42:49

标签: python csv testing

我正在尝试编写一个登录模块,该模块在.csv文件中搜索输入的用户名。如果找到用户名,它将采用输入的密码,并将其通过一个函数进行验证(该密码先保存并散列,然后再保存到.csv文件中。)

我运行了以下代码,以测试列表中的用户名和正确的密码,列表中未包含的用户名,列表中的用户名和错误的密码的预期结果。

with open('userDB.csv', 'rt') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        for field in row:
            if user == row[0]:
                psChk = row[1]
                if verify_password(psChk, password):
                    print('In')
                else:
                    print('Out!!')
            else:
                print('Out!!')
                sys.exit()

对于在列表中具有用户名和正确密码的测试,我得到两次打印“ In”语句,而当在列表中为用户进行测试并且密码不正确时,我得到了两次“输出”提示。虽然这是理想的结果,但我只想了解这里发生的情况。

当我测试用户名不在列表中时,“输出”仅打印一次。

def verify_password(stored_password,provided_password):
    """Verify a stored password against one provided by user"""
    salt = stored_password[:64]
    stored_password = stored_password[64:]
    pwdhash = hashlib.pbkdf2_hmac('sha512',provided_password.encode('utf-8'),salt.encode('ascii'),100000)
    pwdhash = binascii.hexlify(pwdhash).decode('ascii')
    return pwdhash == stored_password

1 个答案:

答案 0 :(得分:1)

错误是这一行 for field in row:

您正在检查每一行中每个字段的用户名和密码。由于每行中都有两个字段(“用户名”和“密码”),因此它执行两次。

解决方法是:

with open('userDB.csv', 'rt') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        if user == row[0]:
            psChk = row[1]
            if verify_password(psChk, password):
                print('In')
            else:
                print('Out!!')
        else:
            print('Out!!')
            sys.exit()