需求
工資管理系統(tǒng)
Alex 100000
Rain 80000
Egon 50000
Yuan 30000
-----以上是info.txt文件-----
實現(xiàn)效果:
從info.txt文件中讀取員工及其工資信息,最后將修改或增加的員工工資信息也寫入原info.txt文件。
效果演示:
- 查詢員工工資
- 修改員工工資
- 增加新員工記錄
- 退出
>>:1
請輸入要查詢的員工姓名(例如:Alex):Alex
Alex的工資是:100000。
\1. 查詢員工工資
\2. 修改員工工資
\3. 增加新員工記錄
\4. 退出:2
請輸入要修改的員工姓名和工資,用空格分隔(例如:Alex 10):Alex 10
修改成功!
- 查詢員工工資
- 修改員工工資
- 增加新員工記錄
- 退出
>>:3
請輸入要增加的員工姓名和工資,共空格分割(例如:Eric 100000):Eric 100000
增加成功!
\1. 查詢員工工資
\2. 修改員工工資
\3. 增加新員工記錄
\4. 退出
>>:4
再見!
這個作業(yè)和上周我們做的購物車商家接口,管理商品列表的模塊十分類似,可以借鑒一下。
流程圖我們可以先畫:

實現(xiàn)
根據(jù)這個操作流程,我們可以先寫出一個demo:
#owner:houyizhong
#version:1.0
staff_dict={}
f=open("info.txt","r")
lines=f.readlines()
f.close()
#read staff
for i in lines:
raw=i.split(" ")
name=raw[0]
salary=raw[1].strip()
staff_dict[name]=salary
#print staff
f=open("info.txt","r")
for line in f:
print line,
f.close()
#write file
def write_file():
f=open("info.txt","w")
for name in staff_dict:
f.write("{0} {1}\n".format(name,staff_dict[name]))
f.close()
def search():
choice_name=input("請輸入要查詢的員工姓名(例如:Alex):")
if choice_name in staff_dict:
salary=staff_dict[choice_name]
print("{0}的工資是:{1}".format(choice_name,salary))
else:
print("Sorry,your enter is not a staff!")
def modify():
enter=input("請輸入要修改的員工姓名和工資,用空格分隔(例如:Alex 10):")
list=enter.split(" ")
name=list[0]
salary=list[1]
if name in staff_dict:
staff_dict[name]=salary
print("修改成功!")
else:
print("Sorry,your enter is not a staff!")
def add():
enter=input("請輸入要增加的員工姓名和工資,共空格分割(例如:Eric 100000):")
list=enter.split(" ")
name=list[0]
salary=list[1]
staff_dict[name]=salary
print("操作成功!")
while True:
print("1. 查詢員工工資\n2. 修改員工工資\n3. 增加新員工記錄\n4. 退出")
choice=input(">>")
if choice == "1":
search()
elif choice == "2":
modify()
elif choice == "3":
add()
elif choice == "4":
write_file()
exit("再見!")
else:
print("Your enter invalid!Try again.")
這里用字典來盛放員工信息,每次修改只是對字典的修改,只有退出的時候才會將字典寫入文件里,這么做的道理是,我修改員工信息或者新增員工時就不用重復(fù)的打開、寫入文件了,每次運行程序只需一次寫入文件操作,大大降低了文件操作的負(fù)擔(dān),同時避免了修改完文件之后,字典里還是顯示啟動時讀取的內(nèi)容,沒有跟上后續(xù)內(nèi)容的變化,而我們這樣寫就可以實時看到、修改自己剛才增改的內(nèi)容了。
按照這個程序運行結(jié)果來看,確實實現(xiàn)了需求所述的內(nèi)容?,F(xiàn)在我們來對一些細(xì)枝末節(jié)的東西做些優(yōu)化。
我們注意到這個程序還有一個bug,就是修改新增操作的時候如果只寫了員工名,沒有加工資是會有問題的,所以我們也需要對這一部分內(nèi)容做個判斷,優(yōu)化之后的代碼如下:
#-*- coding:utf-8 -*-
#owner:houyizhong
#version:2.0
staff_dict={}
f=open("info.txt","r")
lines=f.readlines()
f.close()
#read staff
for i in lines:
raw=i.split(" ")
name=raw[0]
salary=raw[1].strip()
staff_dict[name]=salary
#print staff
f=open("info.txt","r")
for line in f:
print (line,end='')
f.close()
#write file
def write_file():
f=open("info.txt","w")
for name in staff_dict:
f.write("{0} {1}\n".format(name,staff_dict[name]))
f.close()
def search():
choice_name=input("請輸入要查詢的員工姓名(例如:Alex):")
if choice_name in staff_dict:
salary=staff_dict[choice_name]
print("{0}的工資是:{1}".format(choice_name,salary))
else:
print("Sorry,your enter is not a staff!")
def modify():
enter=input("請輸入要修改的員工姓名和工資,用空格分隔(例如:Alex 10):")
list=enter.split(" ")
if len(list) == 2:
name=list[0]
salary=list[1]
if salary.isdigit():
if name in staff_dict:
staff_dict[name]=salary
print("修改成功!")
else:
print("Sorry,your enter is not a staff!")
else:
print("Please enter correct salary!")
else:
print("Please enter correct information!")
def add():
enter=input("請輸入要增加的員工姓名和工資,共空格分割(例如:Eric 100000):")
list=enter.split(" ")
if len(list) == 2:
name=list[0]
salary=list[1]
if salary.isdigit():
staff_dict[name]=salary
print("操作成功!")
else:
print("Please enter correct salary!")
else:
print("Please enter correct information!")
while True:
print("1. 查詢員工工資\n2. 修改員工工資\n3. 增加新員工記錄\n4. 退出")
choice=input(">>")
if choice == "1":
search()
elif choice == "2":
modify()
elif choice == "3":
add()
elif choice == "4":
write_file()
exit("再見!")
else:
print("Your enter invalid!Try again.")
我們在modify(),add()這兩個函數(shù)的主邏輯里,加入了if len(list) == 2: 這句話,這樣就能判斷用戶輸入的信息是否是兩個,是否符合要求,同時也加入了if salary.isdigit():這句,用來判斷輸入的最后一項是不是個數(shù)字。
結(jié)語
我們利用了字典,函數(shù)和讀取寫入文件方面的知識,為了避免操作的復(fù)雜性,和為了代碼的易讀性,我們將所有的修改操作都先寫入字典中,再由字典寫入文件,文件即時修改方面可能不夠快,但是保證了信息的一致性和完整性。這個在以后的程序設(shè)計中,是一個可以借鑒和考慮的地方。