含密码校验与文件写入的Python菜单程序故障求助
密码校验模块修复方案
原代码核心问题
- 校验函数逻辑错误:
caps_found_pass、lowercase_found_pass、number_found_pass三个函数中,return found语句被放在for循环内部,导致循环仅执行一次就返回结果。比如检查大写字母时,只会校验'A',密码中其他大写字母不会被检测到,直接返回False。 - 密码长度判断错误:原代码用
password <15(字符串和数字比较),逻辑错误,应该判断密码长度的数值范围。 - 注册流程文件写入逻辑错误:写入密码的代码位于
while True循环外部,永远无法执行,需放到校验通过的分支内并终止循环。 - 登录函数逻辑错误:遍历账号文件时,第一行不匹配就直接返回False,未检查后续行。
修复后的完整代码
import string caps = string.ascii_uppercase lowercase = string.ascii_lowercase numbers = [str(i) for i in range(10)] # 简化列表生成 def caps_found_pass(pw): found = False for letter in caps: if letter in pw: # 用in操作更直观,替代find found = True break # 找到后直接终止循环 return found # return放在循环外部 def lowercase_found_pass(pw): found = False for letter in lowercase: if letter in pw: found = True break return found def number_found_pass(pw): found = False for number in numbers: if number in pw: found = True break return found def register(): user_names_add = input("Enter your first name and last name: ") c = user_names_add.split() initial = c[0][0] lastname_initial = c[1][0] user_dob_add = input("Enter your Date Of Birth in format DDMMYYYY: ") username = initial + lastname_initial + user_dob_add # 先打开文件写入用户名,保持追加模式 with open("accounts.txt", "a") as file: file.write(username + " ") print("Your new username is", username) while True: password = input("Please input your desired password: ") # 修复长度判断逻辑 if 7 <= len(password) <= 14: if caps_found_pass(password): if lowercase_found_pass(password): if number_found_pass(password): print(f'Your password is {password}') # 校验通过后写入密码并退出循环 with open("accounts.txt", "a") as file: file.write(password + "\n") break else: print("Password must contain a number") else: print("Password must contain a lowercase letter") else: print("Password must contain a capital letter") else: print("Password must contain at least 7 characters and no more than 14") def login(): username = input("Please enter your username: ") password = input("Please enter your password: ") # 用with语句自动管理文件 with open("accounts.txt", "r") as file: for line in file.readlines(): login_info = line.strip().split() if len(login_info) != 2: continue # 跳过格式错误的行 if username == login_info[0] and password == login_info[1]: print("User and Pass correct logging in...") return True # 遍历完所有行都不匹配才提示错误 print("Incorrect User and/or pass.") return False def test(): # 实现查看所有用户和密码的功能 try: with open("accounts.txt", "r") as file: print("\nAll registered accounts:") for line in file.readlines(): line = line.strip() if line: print(line) except FileNotFoundError: print("No accounts registered yet.") def quit_program(): print("quitting") def invalid(): print("invalid") def user_menu(): print() print("Menu") print("-------------") print() print("Select A Function") print("1. Login") print("2. Register") print("3. Testing/View all Users and Passwords") print("9. Quit") print() selection = input("Type 1, 2, 3 or 9: ") return selection quit_program_flag = False while not quit_program_flag: option = user_menu() if option == "1": login() elif option == "2": register() elif option == "3": test() elif option == "9": quit_program_flag = True quit_program() else: invalid()
额外优化说明
- 用
in操作替代find,代码更直观易读。 - 校验函数中找到匹配字符后用
break终止循环,提升效率。 - 使用
with语句管理文件,避免忘记关闭文件导致的资源泄漏。 - 修复了test函数,实现查看所有账号的功能(原函数仅打开文件无实际操作)。
- 重命名了
quit函数为quit_program,避免和内置函数quit冲突。
内容的提问来源于stack exchange,提问作者Jay Gemmell
相关产品推荐
相关产品推荐

