You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含密码校验与文件写入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:40:37