路飞学城系列:第2章 数据类型&文件操作-练习(3-续)【模拟登陆-优化升级】

# coding: utf-8

"""
练习题2 —— 模拟登陆-听课后升级:

    用户输入帐号密码进行登陆
    用户信息保存在文件内
    用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了

    知识点:
    1、运用字典,对字符串str()和字典eval()互转,在文本中存储和读取账号信息。
    2、暂时不写功能的方法内,可以写pass,我看Alex喜欢这样写。
    3、缩进:选中+tab。左移:选择+shift+tab

    注意:
    1、文本中 只能存储str字符串(存入的字典也是字符串)。
    2、文本的 读取 和 写入,不能同时进行,建议读完就close,写完就close,及时关闭。

    思路:【Alex的思路,是拆分功能,一块一块的实现。由上到下(需求),一点一点啃出来。】
    1、先创建一个字典,填好数据,按照层级存放账号信息。
    2、编写代码,读取字典,实现账号登录逻辑,以及账号锁定等修改字典的逻辑。
    3、创建一个文本,把字典模拟数据,放入文本中。
    4、编写读取文本信息,转为字典(赋值给1中创建的字典),套用2中逻辑,并进行对应的写入。

"""

"""
# 创建字典,存储模拟登录账号信息
user_info_dict = {
    "Alex" : ["abc123", 0],   # 姓名:[密码,锁定状态(0未锁定,1锁定)]
    "李祯" : ["123456", 1],
    "牛魔王" : ["abcde12345!", 0]
}
# 创建文件,写入字典中的用户账号信息
with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
    f.write(str(user_info_dict))    # 把dict转为str后,存入到文件
"""

# 读取文件,把文件中存的用户账号信息,读取出来、并且存入字典中
with open("模拟登录_听课后升级.txt", mode="r", encoding="utf-8") as f:
    # 创建字典,存储模拟登录账号信息(把读取的str转换为dict)
    user_info_dict = eval(f.read())

# 登录次数(输入账号密码),连续失败3次后锁定账号
login_count = 0
# 3次登录过程中,是否为相同账号
is_same_user = True
# 上一次登录的账号
last_login_user = None
# 通过while循环,实现用户登录逻辑
while login_count < 3:

    # 用户输入账号
    user_input_name = input("请输入您的账号:")
    # 用户输入密码
    user_input_pwd = input("请输入您的密码:")
    # 用户登录次数加1
    login_count += 1

    # 更新上次登录账号状态
    if last_login_user is None:  # 肯定是第一次登录
        last_login_user = user_input_name
    # 判断登录账号是否与上次登录账号一致,账号有变更,则更新 last_login_user 和 last_login_user 状态
    if user_input_name != last_login_user:
        is_same_user = False

    # 账号存在
    if user_input_name in user_info_dict:
        # 账号未锁定
        if user_info_dict[user_input_name][1] == 0:
            last_login_user = user_input_name
            # 密码正确
            if user_input_pwd == user_info_dict[user_input_name][0]:
                print("密码正确,您已登录...")
                break
            # 密码连续错误3次(没有别的账号登录),账号锁定
            elif is_same_user is True and login_count == 3:
                print("密码连续输错3次,账号{0}已被锁定...".format(user_input_name))

                # 修改字典中存储的用户账号信息,变更锁定状态
                user_info_dict[user_input_name][1] = 1
                # 修改文件,把字典中用户账号信息,更新(存入)到文件中
                with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
                    f.write(str(user_info_dict))

                break
            # 密码错误
            else:
                print("密码错误,登录失败...")

        # 账号锁定
        else:
            print("账号{0}已被锁定".format(user_input_name))

    # 账号不存在
    else:
        print("账号不存在")

# 打印看一下字典状态
print(user_info_dict)

  

原文地址:https://www.cnblogs.com/lizhen416/p/13662113.html