day3新作業:工資管理系統
作者:LiYan(李岩)
博客地址:http://www.cnblogs.com/yange/p/7022072.html
環境:
- 系統環境: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]()