完成了以下两点的修改:
# -*- 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()