逻辑一致的两个Python登录函数一个正常一个报错的原因是什么
问题原因梳理
1. 登录成功后仍输出账号密码错误的核心原因
- 函数执行流程未正确终止:当账号密码校验通过、打印登录成功并调用
CustomerMenu()后,若CustomerMenu()执行完毕会回到当前LCustomerAccount()函数继续向下执行,因此会命中循环外的错误提示代码。你虽然关闭了文件,但没有主动终止当前函数运行,需要在调用CustomerMenu()后加return语句直接退出函数。 - 行内容清洗缺失:客户登录的代码中读取每行后没有调用
strip()去除行尾的换行符、首尾空白字符,若存储账号的文件行尾带有换行符,拆分出来的密码会自带换行符,导致和用户输入的密码匹配失败,这也是潜在的报错风险。
2. ValueError: too many values to unpack (expected 2)报错原因
该报错是字符串拆分后得到的元素数量大于2,无法赋值给两个变量导致的,触发场景有两个:
- 管理员登录逻辑中使用
split("|")时未指定最大拆分次数,若某行账号/密码内容里包含|字符,就会拆分出3个及以上的元素,触发报错。 - 若账号存储文件中存在内容不规范的行(比如包含多个
|的异常行),也会触发该报错。你客户登录逻辑里加了split("|",1)指定最多拆成2份,已经规避了这个问题,报错大概率出在管理员登录逻辑或者客户文件存在异常行。
修复后的代码参考
def LCustomerAccount(): EnteredID = str(input("========== Please Type in Your Account ID:")) EnteredPassword = str(input("========== Please Type in Your Password:")) # 用with语句自动管理文件关闭,避免手动关闭的遗漏问题 with open("Customerlogin.txt","r") as B: for line in B.readlines(): # 先strip去除首尾空白/换行符,再拆分,最多拆2份 id,pw = line.strip().split("|",1) if EnteredID == id and EnteredPassword == pw: print ("Customer Login successful") CustomerMenu() # 登录成功直接返回,不执行后续错误提示 return print ("Wrong Account Number/password") menu()
同理管理员登录代码也建议做相同修改,添加最大拆分参数和匹配成功后的return语句。
内容的提问来源于stack exchange,提问作者Lee Wen Dick
相关产品推荐
相关产品推荐

