day3新作业:工资管理系统
作者:LiYan(李岩)
环境:
系统环境:Windows 10 专业版
python版本:3.6.0
pycharm版本:2017.1.3
作业内容:
从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件
查询员工工资
增加新员工记录
修改员工工资
删除员工记录
退出
实现需求:
实现对文件做增、删、改、查的操作
流程图:
代码结构:
整体操作共有五个选项,分别是:
查询:
员工姓名不存在,重新输入
员工姓名存在,输出其对应的工资
新增:
员工姓名存在,重新输入
员工姓名不存在,添加信息到文件
修改:
员工姓名不存在,重新输入
员工姓名存在,修改工资,把修改前、修改中、修改后的信息一起写入到新文件
删除原文件,重命名新文件
删除:
员工姓名不存在,重新输入
员工姓名存在,删除信息,把剩余信息写入到新文件
删除原文件,重命名新文件
退出:退出操作;
直接退出程序
文件结构:
salary.py:主程序
info.txt:员工信息存储文件
ReadMe.md:说明文档
png文件:流程图
测试:
程序运行之后输入(1,2,3,4,5)进行相关操作:
选择1和4,只需要输入员工姓名
选择2和3,需要输入员工姓名和工资,中间以空格分开
选择5,程序直接退出
小结:
难点
中间有很多重复的代码,不知道该怎么优化
文件增、删、改的操作比较难理解
空行的格式化比较难
问题
选择添加和修改时,只输入员工姓名也是可以成功的
无法判断输入的信息属于哪种类型
修改最后一条记录时,写不进去数据
删除最后一条记录时,会多出一行空行
员工信息存储文件(info.txt):
Alex 11111
Rain 80000
Egon 50000
Yuan 30000
liyan 88888888
yy 999999999
yange 6666
yan 1
代码:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __Author__ = Yan Li
# 导入模块
import sys
import os
# 员工信息存储文件
filename = 'info.txt'
# 过滤空行后的员工信息文件
new_filename = 'new_info.txt'
# 员工姓名列表
info_dict = {}
# 员工工资列表
user_dict = {}
# 提取用户信息
def info():
with open(filename, 'r') as f:
for i in f:
if not i.startswith('\n'):
i = i.strip()
# 把员工和工资信息加入字典
info_dict[i.split(' ')[0]] = i.split(' ')[1]
# 删除和移动文件
def file():
# 把原文件删除
os.remove(filename)
# 把新文件重命名为原文件名
os.rename(new_filename, filename)
# 查询
def select():
while True:
info()
user_info = input('请输入员工姓名:').strip()
if user_info in info_dict.keys():
print('%s的工资是:%s' % (user_info, info_dict[user_info]))
break
else:
print('用户不存在!!!')
# 新增
def insert():
while True:
info()
user_info = input('请输入要增加的员工姓名和工资:').strip()
# 把新员工的姓名和工资加入字典
user_dict[user_info.split(' ')[0]] = user_info.split(' ')[1]
# 把新员工信息转为列表
user_list = user_info.split(' ')
# 当新员工在当前员工信息文件中不存在
if user_list[0] not in info_dict.keys():
user_info = '\n' + user_info + '\n'
# 写入新员工信息到文件中
with open(filename, 'a+') as f:
f.write(user_info)
print('%s 添加成功!' % user_list[0])
break
else:
# 当新员工在当前员工信息文件中存在
print('用户已存在!!!')
# 修改
def update():
while True:
info()
user_info = input('请输入要修改的员工姓名和工资:').strip()
# user_dict[user_info.split(' ')[0]] = user_info.split(' ')[1]
# 把新员工信息转为列表
user_list = user_info.split(' ')
# 当前需要修改的员工信息
user_now = '%s %s' % (user_list[0], info_dict[user_list[0]])
# 当新员工在当前员工信息文件中存在
if user_list[0] in info_dict.keys():
with open(filename, 'r') as fr, open(new_filename, 'w') as fw:
tag = False
for i in fr:
if i.strip() == user_now:
tag = True
continue
if not tag:
fw.write(i)
else:
fw.write(user_info + '\n\n')
if tag and i.startswith('\n'):
tag = False
file()
print('%s 修改成功!' % user_list[0])
break
else:
# 当新员工在当前员工信息文件中不存在
print('用户不存在!!!')
# 删除
def delete():
while True:
info()
user_info = input('请输入要删除的员工姓名:').strip()
# 当前需要修改的员工信息
user_now = '%s %s' % (user_info, info_dict[user_info])
# 当删除的员工在当前员工信息文件中存在
if user_info in info_dict.keys():
with open(filename, 'r') as fr, open(new_filename, 'w') as fw:
tag = False
for i in fr:
if i.strip() == user_now:
tag = True
continue
if not tag:
fw.write(i)
if tag and i.startswith('\n'):
tag = False
file()
print('%s 删除成功!' % user_info)
break
else:
# 当删除的员工在当前员工信息文件中不存在
print('用户不存在!!!')
choose_msg = '''
1: 查询
2: 新增
3: 修改
4: 删除
5: 退出
'''
salary = {
'1': select,
'2': insert,
'3': update,
'4': delete,
'5': sys.exit,
}
while True:
print(choose_msg)
# 选择操作
choose = input('\033[31;1m请输入操作选项:\033[0m').strip()
if choose not in salary.keys():
continue
salary[choose]()