个人信息修改程序
用户文件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)