五,代碼簡單修改
完成了以下兩點的修改:
- 將主菜單顏色換爲紫色,提示語句換位綠色
- 成績顯示部分進行了對其操作
- 將排序部分的錯誤返回改爲while循環
完整代碼
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 16 10:07:30 2020
@author: HPN
"""
import re # 導入正則表達式模塊
import os # 導入操作系統模塊
filename = "students.txt" # 定義保存學生信息的文件名
'''主菜單'''
def menu():
#輸出菜單
print('''\033[1;35m
┏------------------學生信息管理系統-------------------┓
| ================== 功能菜單 ================ |
| 1 錄入學生成績信息 |
| 2 查找學生成績信息 |
| 3 刪除學生成績信息 |
| 4 修改學生成績信息 |
| 5 學生成績排序 |
| 6 學生數量 |
| 7 顯示所有學生成績信息 |
| 0 退出系統 |
┗---------------------------------------------------┛
\33[0m ''')
'''主函數'''
def main():
ctrl = True#控制是否退出系統
while (ctrl):
menu()#顯示菜單
option = input("\033[1;32m請選擇功能(輸入:1或2或3...):\033[0m")#提示輸入數字
option_str = re.sub("\D","",option)#提取數字
if option_str in ['0','1','2','3','4','5','6','7']:#判斷數字是否在0~7內
option_int = int(option_str)#轉換成整型變量
if option_int == 0:
ctrl = False
print("\033[1;32m您已退出學生信息管理系統\033[0m")
elif option_int == 1:#錄入學生成績信息
insert()
pass
elif option_int == 2:#查找學生成績信息
search()
pass
elif option_int == 3:#刪除學生成績信息
delete()
pass
elif option_int == 4:#修改學生成績信息
modify()
pass
elif option_int == 5:#排序
sort()
pass
elif option_int == 6:#統計學生總數
total()
pass
elif option_int == 7:#顯示所有學生信息
show()
pass
''' 保存學生信息函數 '''
def save(student):
try:
students_txt = open(filename,'a')#以追加模式打開
except Exception as e:
students_txt = open(filename,'w')#文件不存在,創建文件並打開
for info in student:
students_txt.write(str(info) + '\n')#按行儲存,添加換行符
students_txt.close()
'''1 錄入學生信息函數 '''
def insert():
studentList = []#保存學生信息的列表
mark = True#是否進入循環
while mark:
s_id = input("\033[1;32m請輸入ID(學號):\033[0m")#輸入學號
if not s_id :#ID 爲空,跳出循環
break
name = input("\033[1;32m請輸入名字:\033[0m")#輸入名字
if not name:
break
try:
english = int(input("\033[1;32m請輸入英語成績:\033[0m"))
python = int(input("\033[1;32m請輸入Python成績:\033[0m"))
c = int(input("\033[1;32m請輸入C成績:\033[0m"))
except:
print("\033[1;32m輸入無效,不是整形數值........請重新錄入信息\033[0m")
continue
#將輸入的學生信息保存到字典
student = {"id":s_id,"name":name,"english":english,"python":python,"c":c}#將獲得的信息變成字典的形式
studentList.append(student)#將學生字典添加到列表中
inputMark = input("\033[1;32m是否繼續添加?(y/n):\033[0m")#判斷是否繼續添加
if inputMark == "y" :
mark = True
else:
mark = False
save(studentList)#將列表保存在指定的文件中
print("\033[1;32m學生信息錄入完畢\033[0m")
'''2 查找學生信息 '''
def search():
mark = True#判斷是否繼續查找
student_query = []#保存查詢結果的學生列表
while mark:
id = ""
name = ""
if os.path.exists(filename) :
mode = input("\033[1;32m按ID查找請輸入1;按姓名查找請輸入2;\033[0m")
if mode == '1' :
id = input("\033[1;32m請輸入學生ID:\033[0m")
elif mode == '2' :
name = input("\033[1;32m請輸入學生姓名:\033[0m")
else:
print("\033[1;32m您的輸入有誤,請重新輸入!\033[0m")
#search()#重新查詢
continue#重新查新
with open(filename,'r') as file:#只讀形式打開文件
student = file.readlines()#列表形式多行讀取
for list in student :#按行進行遍歷列表
d = dict(eval(list))#將列表轉換成字典
if id is not "" :
if d["id"] == id :
student_query.append(d)#將找到的信息添加到準備好的列表中
elif name is not "" :
if d['name'] == name :
student_query.append(d)
show_student(student_query)#顯示學生信息
student_query.clear()#清除學生列表
inputMark = input("\033[1;32m是否繼續查詢?(y/n):\033[0m")
if inputMark == "y" :
mark = True
else:
mark = False
else:
print("\033[1;32m暫未保存信息....\033[0m")
return
'''顯示保存在列表中的信息'''
def show_student(studentList):
if not studentList:
print("\033[1;32m(╯‵□′)╯︵┻━┻沒有數據信息\n\033[0m")
return
#定義標題顯示格式
format_title = "{:^6}{:^20}\t{:^12}{:^12}{:^12}{:^12}"
#"{:>6}{:>12}\t{:>12}\t{:>12}\t{:>12}\t{:>12}"
print(format_title.format("ID","名字","英語成績","Python成績","C語言成績","總成績"))
#定義具體內容顯示格式
format_data = "{:^6}{:^20}\t{:^12}\t{:^12}\t{:^12}\t {:^12}"
for info in studentList:
print(format_data.format(info.get("id"),
info.get("name"),
str(info.get("english")),
str(info.get("python")),
str(info.get("c")),
str(info.get("english") + info.get("python") + info.get("c")).center(12)))
'''3 刪除學生信息'''
def delete():
show()
mark = True # 標記是否循環
while mark:
studentId = input("\033[1;32m請輸入要刪除的學生ID:\033[0m")
if studentId is not "": # 判斷要刪除的學生是否存在
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內容
else:
student_old = []
ifdel = False # 標記是否刪除
if student_old: # 如果存在學生信息
with open(filename, 'w') as wfile: # 以寫方式打開文件
d = {} # 定義空字典
for list in student_old:
d = dict(eval(list)) # 字符串轉字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") # 將一條學生信息寫入文件
else:
ifdel = True # 標記已經刪除
if ifdel:
print("\033[1;32mID爲 %s 的學生信息已經被刪除...\033[0m" % studentId)
else:
print("\033[1;32m沒有找到ID爲 %s 的學生信息...\033[0m" % studentId)
else: # 不存在學生信息
print("\033[1;32m無學生信息...\033[0m")
break # 退出循環
show() # 顯示全部學生信息
inputMark = input("\033[1;32m是否繼續刪除?(y/n):\033[0m")
if inputMark == "y":
mark = True # 繼續刪除
else:
mark = False # 退出刪除學生信息功能
'''4 修改學生信息 '''
def modify():
show()
if os.path.exists(filename) :
with open(filename,'r') as rfile:#打開文件
student_old = rfile.readlines()#按行讀取
else:
print("\033[1;32m暫未保存數據...\033[0m")
return
studentid = input("\033[1;32m請輸入要修改的學生ID:\033[0m")
with open(filename,"w") as wfile:
for student in student_old :
d = dict(eval(student))
if d['id'] == studentid :
print("\033[1;32m找到了這名學生,可以修改他的信息\033[0m")
while True:
try:
d['name'] = input("\033[1;32m請輸入姓名:\033[0m")
d['english'] = int(input("\033[1;32m請輸入英語成績:\033[0m"))
d['python'] = int(input("\033[1;32m請輸入Python成績:\033[0m"))
d['c'] = int(input("\033[1;32m請輸入C語言成績:\033[0m"))
except:
print("\033[1;32m您的輸入有誤,請從新輸入!\033[0m")
else:
break
student = str(d)
wfile.write(student + '\n')
print("\033[1;32m修改成功!\033[0m")
else:
wfile.write(student)
mark = input("\033[1;32m是否繼續修改其他學生信息?(y/n):\033[0m")
if mark == 'y' :
modify()
'''5 排序'''
def sort():
show()#顯示全部學生信息
mark = True
while mark :
if os.path.exists(filename) :
with open(filename,'r') as file:
student_old = file.readlines()
student_new = []
for list in student_old:
d = dict(eval(list))
student_new.append(d)
else:
return
ascORdesc = input("\033[1;32m請選擇(0:升序;1:降序):\033[0m")
if ascORdesc == "0" :
ascORdescBool =False
elif ascORdesc == "1" :
ascORdescBool = True
else:
print("\033[1;32m您的輸入有誤,請重新輸入!\033[0m")
continue
mode = input('''\033[1;32m請選擇排序方式
(1:按英語成績排序;
2:按python成績排序;
3:按C語言成績排序;
0:按總成績排序):\033[0m''')
if mode == "1" :
student_new.sort(key = lambda x:x['english'],reverse = ascORdescBool)
elif mode == "2" :
student_new.sort(key = lambda x:x['python'],reverse = ascORdescBool)
elif mode == "3" :
student_new.sort(key = lambda x:x['c'],reverse = ascORdescBool)
elif mode == "0" :
student_new.sort(key = lambda x:x['english'] + x['python'] + x['c'],reverse = ascORdescBool)
else:
print("\033[1;32m您的輸入有誤,請重新輸入!\033[0m")
continue
show_student(student_new)
get = input("\033[1;32m是否繼續進行排序(y/n):\033[0m")
if get == "y" :
mark = True
else:
mark = False
'''6 統計學生總數'''
def total():
if os.path.exists(filename) :
with open(filename,'r') as rfile:#只讀形式
student_old = rfile.readlines()
if student_old :
print("\033[1;32m一共有 %d 名學生!\033[0m" % len(student_old))
else:
print("\033[1;32m還沒有錄入學生信息!\033[0m")
else:
print("\033[1;32m暫未保存數據信息...\033[0m")
'''7 顯示所有學生信息'''
def show():
student_new = []
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內容
for list in student_old:
student_new.append(eval(list)) # 將找到的學生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("\033[1;32m暫未保存數據信息...\033[0m")
if __name__ == "__main__" :
main()
六,生成可執行文件
- 安裝pyinstaller包
- 命令窗口界面鍵入:pyinstaller -F 當前路徑,回車運行
上一篇文章:Python練手項目:學生信息管理系統(上篇)