修改个人信息程序

在一个文件里存多个人的个人信息,如以下

1.输入用户名密码,正确后登录系统 ,打印

1. 修改个人信息
2. 打印个人信息
3. 修改密码

2.每个选项写一个方法

3.登录时输错3次退出程序

修改个人信息

def change_user_info(p_user):
"""
修改用户信息
:param p_user: 用户名
:return:
"""
user_info = STAFF_INFO[p_user]
for ind, val in enumerate(user_info):
if ind > 1:
msg = '%s, %s, %s'%(ind, COLUMN_NAME[ind], val)
print_log(msg) while True:
choice = input("输入要修改的列的序号").strip()
if choice.isdigit():
choice = int(choice)
# if choice > len(user_info) and choice < 2:
if 2 < choice < len(user_info):
print_log('输入要的序号不存在', 'error')
else:
curr_val = user_info[choice]
print_log('当前值为'+curr_val)
new_val = input('input new_value->').strip()
user_info[choice] = new_val
STAFF_INFO[p_user] = user_info
save_db()
msg = '%s修改成功'%COLUMN_NAME[choice]
print_log(msg)
break else:
print_log('输入错误,请输入2-6的数字', 'error')

打印个人信息

def print_user_info(p_user):
"""
打印用户信息
:param user: 用户名
:return:
"""
person_data = STAFF_INFO[p_user]
# 使用切片把username,Password过滤掉
# 相当于深拷贝,如果数据量大,会占用大量内存空间
# person_data = person_data[COLUMN_NAME.index('Name'):]
for i in range (0, COLUMN_NAME.index('Name')):
person_data.pop(0)
# print(person_data)
info = '''
------------------
Name: {}
Age : {}
Job : {}
Dept: {}
Phone: {}
------------------
''' .format(*person_data)
print_log(info)

修改密码

def change_user_pwd(p_user):
"""
修改密码
:param p_user:
:return:
"""
while True:
pwd1 = input("输入新密码->").strip()
pwd2 = input("再输一次新密码->").strip()
if pwd1 == pwd2:
pwd_ind = COLUMN_NAME.index('Password') # 得到密码索引
STAFF_INFO[user][pwd_ind] = pwd2
save_db()
print_log('密码修改成功')
break
else:
print_log('密码两次输入不一致','error')

用户登陆

def login_auth(username, pwd):
"""
用户名密码验证
:param username:
:param pwd:
:return:
"""
if username in STAFF_INFO:
if pwd == STAFF_INFO[username][1]:
return True
else:
print_log('用户名与密码不一致','error')
return False
else:
print_log('用户名不存在','error')
return False

保存到文件

def save_db():
"""
保存到文件中
:return:
"""
f = open(DB_FILE, "r+", encoding='utf-8')
f.seek(0)
f.truncate() # 清空文件
for v_data in STAFF_INFO.values():
row_data = ','.join(v_data)
f.write('%s\n'% row_data) f.close()

详细代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/3/21 10:33
# @Author : hyang
# @File : Person_manage.py
# @Software: PyCharm DB_FILE = 'account.txt'
COLUMN_NAME =['Username','Password','Name','Age','Job','Dept','Phone']
MENU = '''
1. 打印个人信息
2. 修改个人信息
3. 修改密码
''' # 打印信息
def print_log(msg, log_type="info"):
if log_type == 'info':
print("\033[32;1m%s\033[0m" %msg)
elif log_type == 'error':
print("\033[31;1m%s\033[0m" %msg) def load_db():
"""
载入人员信息
:return:
"""
staff_data = {}
# 构建字典空列表
#{'Username': ['username','Password','Name','Age','Job','Dept','Phone'}
# for d in COLUMN_NAME:
# staff_data[d] = [] with open(DB_FILE, 'r', encoding='utf-8') as f:
for line in f:
datas = line.split(",")
# 构建员工信息字典
datas[-1] = datas[-1].strip() # 去掉回车 staff_data[datas[0]] = datas return staff_data def print_user_info(p_user):
"""
打印用户信息
:param user: 用户名
:return:
"""
person_data = STAFF_INFO[p_user]
# 使用切片把username,Password过滤掉
# 相当于深拷贝,如果数据量大,会占用大量内存空间
# person_data = person_data[COLUMN_NAME.index('Name'):]
for i in range (0, COLUMN_NAME.index('Name')):
person_data.pop(0)
# print(person_data)
info = '''
------------------
Name: {}
Age : {}
Job : {}
Dept: {}
Phone: {}
------------------
''' .format(*person_data)
print_log(info) def save_db():
"""
保存到文件中
:return:
"""
f = open(DB_FILE, "r+", encoding='utf-8')
f.seek(0)
f.truncate() # 清空文件
for v_data in STAFF_INFO.values():
row_data = ','.join(v_data)
f.write('%s\n'% row_data) f.close() def change_user_info(p_user):
"""
修改用户信息
:param p_user: 用户名
:return:
"""
user_info = STAFF_INFO[p_user]
for ind, val in enumerate(user_info):
if ind > 1:
msg = '%s, %s, %s'%(ind, COLUMN_NAME[ind], val)
print_log(msg) while True:
choice = input("输入要修改的列的序号").strip()
if choice.isdigit():
choice = int(choice)
# if choice > len(user_info) and choice < 2:
if 2 < choice < len(user_info):
print_log('输入要的序号不存在', 'error')
else:
curr_val = user_info[choice]
print_log('当前值为'+curr_val)
new_val = input('input new_value->').strip()
user_info[choice] = new_val
STAFF_INFO[p_user] = user_info
save_db()
msg = '%s修改成功'%COLUMN_NAME[choice]
print_log(msg)
break else:
print_log('输入错误,请输入2-6的数字', 'error') def change_user_pwd(p_user):
"""
修改密码
:param p_user:
:return:
"""
while True:
pwd1 = input("输入新密码->").strip()
pwd2 = input("再输一次新密码->").strip()
if pwd1 == pwd2:
pwd_ind = COLUMN_NAME.index('Password') # 得到密码索引
STAFF_INFO[user][pwd_ind] = pwd2
save_db()
print_log('密码修改成功')
break
else:
print_log('密码两次输入不一致','error') def login_auth(username, pwd):
"""
用户名密码验证
:param username:
:param pwd:
:return:
"""
if username in STAFF_INFO:
if pwd == STAFF_INFO[username][1]:
return True
else:
print_log('用户名与密码不一致','error')
return False
else:
print_log('用户名不存在','error')
return False if __name__ == '__main__':
STAFF_INFO = load_db()
# print(STAFF_INFO)
count = 0
while count < 3:
user = input('用户名:->')
pwd = input('密码:->')
if login_auth(user, pwd):
print('welcome %s'.center(50,'-') % user)
while True: # 用户停留这一层
print(MENU)
user_choice = input(">>>").strip()
if user_choice.isdigit():
user_choice = int(user_choice)
if user_choice == 1:
# 用户登录成功打印用户信息
print_user_info(user)
elif user_choice == 2:
change_user_info(user)
elif user_choice == 3:
change_user_pwd(user)
elif user_choice == 'q':
break else:
count += 1
else:
print_log("Too many attempts.", 'error')

详细代码

python函数练习——个人信息修改的更多相关文章

  1. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  2. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  3. python:带参数的装饰器,函数的有用信息

    一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func ...

  4. python函数和常用模块(三),Day5

    递归 反射 os模块 sys模块 hashlib加密模块 正则表达式 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数 ...

  5. Day03 - Python 函数

    1. 函数简介 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print():也可以自己创建函数,这 ...

  6. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  7. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

  8. python函数,模块及eclipse使用

    一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...

  9. python——函数

    python--函数 1.介绍: 在过去的十年间,大家广为熟知的编程方法无非两种:面向对象和面向过程,其实,无论哪种,都是一种编程的规范或者是如何编程的方法论.而如今,一种更为古老的编程方式:函数式编 ...

随机推荐

  1. maven安装cucumber的pom文件设置

    1.在windows上安装maven 2.安装Eclipse 3.在eclipse上面配置maven,并新建一个maven项目 4.在maven项目里面找到pom.xml,编辑pom.xml,之后点击 ...

  2. 利用CSS3实现透明边框和多重边框

    使用background-clip属性实现透明边框 .bordertest { border: 30px solid hsla(0,0%,90%,.5); background: #bbb; back ...

  3. CentOS 特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)

    名称 说明 $0 脚本名称 $1-9 脚本执行时的参数1到参数9 $? 脚本的返回值 $# 脚本执行时,输入的参数的个数 $@ 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列 ...

  4. FortiGate外网IPSec链路及运维专线链路到个别网段不通

    1.现状: 如图,用户网段有192.168.50.0/24.192.168.51.0/24和192.168.52.0/24.192.168.53.0/24.在防火墙上有静态路由到运维专线的10.160 ...

  5. (sealed)密封类及密封方法优缺点

    1. 密封类防止被继承 (有利于代码优化, 由于密封类的不被继承性, 代码在搜索此方法时可以直接定位, 不需要一层层的找继承关系) 只有本程序集可以使用 2. 密封类中不需要再写密封方法(一般密封方法 ...

  6. python历史与基本类型

    前言 我自学的方式主要是看文档,看视频,第一次做写博客这么神圣的事情,内心是忐忑的,写的东西比较杂,路过的小伙伴不要嘲笑我,主要是记录一日所学,顺便锻炼一下语言组织能力吧,anyway,这些都不重要, ...

  7. python小结 1

    1.变量 记录状态 类型:数字,字符串,元组,列表,字典 可变不可变(内存地址不变的情况下,值能不能改变): 不可变:字符串,数字,元组 可变:列表,字典 访问顺序: 直接访问:数字 有序:字符串,列 ...

  8. IoGetRelatedDeviceObject学习

    PDEVICE_OBJECT IoGetRelatedDeviceObject( IN PFILE_OBJECT FileObject ) /*++ Routine Description: This ...

  9. .NET Core 中使用GB2312编码报错的问题

    错误描述 环境 dotnet 2.1.4 现象 当代码中使用 System.Text.Encoding.GetEncoding("GB2312") //或者 System.Text ...

  10. URL与URI的区别和联系

    转自:https://www.cnblogs.com/chengdabelief/p/6635045.html 简单理解是这样的:理解URI和URL的区别,我们引入URN这个概念. URI = Uni ...