个人信息修改程序

用户文件userdata.txt
内容如下:

username,password,age,position,department,phone
alex,abc123,24,Engineer,IT,13434332143
libisheng,abc12,25,Teacher,Teach,14345644788
hhjie,123,27,Devops,IT,15800788372

我的代码:

# -*- coding: utf-8 -*-

"""
在一个文件中存多个人的个人信息,如以下:

username,password,age,position,department,phone
alex,abc123,24,Engineer,IT,13434332143
libisheng,abc12,25,Teacher,Teach,14345644788
hhjie,123,27,Devops,IT,15800788372

1、输入用户名和密码,正确后登陆系统,打印
    1. 打印个人信息
    2. 修改个人信息
    3. 修改密码
    q. 退出系统
2、每个选项写一个方法
3、登陆时输错三次退出程序
"""

import os
import sys


def read_data_from_file(file):
    """
    从文件中读取用户数据
    :param file: 用户文件
    :return: 返回标题列表和用户字典
    """
    user_dict = {}
    with open(file, mode='r') as fr:
        title_line = next(fr).strip()  # 迭代器方法next()得到第一行的标题信息
        title_line_list = title_line.split(',')
        for user_line in fr:  # 迭代器方式读取用户文件行内容
            user_line = user_line.strip()
            user_line_list = user_line.split(',')
            user_dict[user_line_list[0]] = user_line_list[1:]  # 用户名作为键key,其他信息打包为列表做为一个整体为值value。
    return title_line_list, user_dict


def write_data_to_file(file, user_dict):
    """
    写入用户信息到备份文件中,写入完成后,将原文件删除,将备份文件更名为原文件
    :param file: 用户文件
    :param user_dict: 更新后的用户字典
    :return:
    """
    backup_file = file + "_backup"
    title_list = read_data_from_file(file)[0]  # 获取文件中的标题列表
    with open(backup_file, mode="w") as fw:
        fw.write(','.join(title_list) + "\n")  # 将标题行写入
        for user in user_dict:  # 遍历字典
            user_info = user + ',' + ','.join(user_dict[user]) + "\n"  # 拼接用户名、用户其他信息以及换行符为每个用户的信息
            fw.write(user_info)
    os.remove(file)
    os.rename(backup_file, file)


def show_user_info(user_dict, user, file):
    user_info = user_dict[user]
    title_list = read_data_from_file(file)[0]
    change_title = title_list[2:]

    template_user = """

        \033[1;35m用户【{0}】您好,您的个人信息如下:\033[0m
        ===============================
        {1:<10}:    {5}
        {2:<10}:    {6}
        {3:<10}:    {7}
        {4:<10}:    {8}
        ===============================
        """
    print(template_user.format(user,
                               change_title[0],
                               change_title[1],
                               change_title[2],
                               change_title[3],
                               user_info[1],
                               user_info[2],
                               user_info[3],
                               user_info[4]))


# show_user_info(read_data_from_file('user_data.txt')[1], 'libisheng')


def change_user_info(user_dict, user, file):
    user_info = user_dict[user]  # 用户user的信息
    title_list = read_data_from_file(file)[0]  # 标题信息
    change_title = title_list[2:]  # 修改字典的标题信息

    template_user = """
    
    \033[1;35m用户【{0}】您好,您的个人信息如下:\033[0m
    ===============================
    {1:<10}:    {5}
    {2:<10}:    {6}
    {3:<10}:    {7}
    {4:<10}:    {8}
    ===============================
    """
    print(template_user.format(user,
                               change_title[0],
                               change_title[1],
                               change_title[2],
                               change_title[3],
                               user_info[1],
                               user_info[2],
                               user_info[3],
                               user_info[4]))

    for index, title_name in enumerate(change_title, 1):  # 遍历要修改的字段名信息
        print(index, title_name, sep=':\t')
    choice = input("请输入要修改的个人信息字段:").strip()
    if choice.isdigit():
        choice = int(choice)
        if 0 < choice <= len(change_title):
            change_data = user_info[choice]
            print("\033[1;34m 当前字段【{0}】的值为:{1} \033[0m".format(change_title[choice - 1], change_data))
            new_data = input("新输入新的值: ").strip()
            if new_data:  # 如果不为空:
                user_info[choice] = new_data
                print(template_user.format(user,
                                           change_title[0],
                                           change_title[1],
                                           change_title[2],
                                           change_title[3],
                                           user_info[1],
                                           user_info[2],
                                           user_info[3],
                                           user_info[4]))
                write_data_to_file(file, user_dict)
                print("\033[1;34m 用户信息修改成功 \033[0m")
            else:
                print("\033[1;31m 输入内容不能为空。\033[0m")
        else:
            print("\033[1;31m 修改的字段不存在。\033[0m")


# change_user_info(read_data_from_file('user_data.txt')[1], 'hhjie', 'user_data.txt')

def change_password(user_dict, user, file):
    _password = user_dict[user][0]
    password = input("请输入原密码:").strip()
    if _password == password:
        print("\033[1;32m 原密码验证成功 \033[0m")
        new_password = input("请输入新密码: ").strip()
        new_password_confirm = input("请确认输入新密码: ").strip()
        if new_password == new_password_confirm:
            user_dict[user][0] = new_password_confirm
            write_data_to_file(file, user_dict)
            print("\033[1;34m 用户密码修改成功 \033[0m")
        else:
            print("\033[1;31m 两次密码输入不相同,请重新输入。 \033[0m")

    else:
        print("\033[1;31m 原密码验证失败 \033[0m")


# change_password(read_data_from_file('user_data.txt')[1], 'hhjie', 'user_data.txt')


def main(user_dict, file):
    menu = '''
    1. 打印个人信息
    2. 修改个人信息
    3. 修改密码
    q. 退出系统
    '''
    try_count = 0
    while True:
        username = input("请输入用户名:").strip()
        password = input("请输入密码: ").strip()
        if username in user_dict:
            if password == user_dict[username][0]:
                print("\033[1;33m 欢迎你【{0}】\033[0m".format(username))
                while True:
                    print(menu)
                    menu_dict = {
                        "1": show_user_info,
                        "2": change_user_info,
                        "3": change_password,
                        "q": sys.exit
                    }
                    choice_menu = input("请选择菜单选项: ").strip().lower()  # 使用字典的成员方法in、not in
                    if choice_menu.isdigit() and choice_menu in menu_dict:
                        menu_dict[choice_menu](user_dict, username, file)
                        continue
                    if choice_menu in menu_dict:  # 这里就是当用户输入为'q'了。退出系统。
                        sys.exit(0)
                    if choice_menu not in menu_dict:
                        print("\033[1;31m 输入选项无效,请重新输入\033[0m")
            else:
                print("\033[1;31m 用户名或密码不正确!\033[0m")
                try_count += 1

        else:
            print("\033[1;31m 用户名不存在!\033[0m")
            try_count += 1
        if try_count == 3:
            print("\033[1;31m 尝试次数超限,系统退出中...!\033[0m")
            break
        print("\033[1;31m 您还有{0}次尝试登录的机会\033[0m".format(3 - try_count))


if __name__ == '__main__':
    file_name = 'user_data.txt'
    user_info_dict = read_data_from_file(file_name)[1]
    main(user_info_dict, file_name)

posted @ 2018-05-06 18:50  hehongjie  Views(187)  Comments(0Edit  收藏  举报