'''
学生信息管理系统:
1、采用本地txt文件存储学生信息
2、包括学号、姓名、英语成绩、python成绩、java成绩
3、实现增、删、改、查、排序、计算总人数、显示全部、退出系统,功能
'''
filename="students.txt" # 定义存放学生信息的文件名
def main():
'''
系统主函数
'''
while True: # 循环,知道用户退出
menu() # 显示主菜单
choice = int(input("请选择:"))
if choice == 0:
a = input("是否确定退出系统?y/n :")
if a == 'y':
print("谢谢使用!")
break
else:
continue
elif choice == 1:
insert()
elif choice == 2:
search()
elif choice == 3:
delete()
elif choice == 4:
modify()
elif choice == 5:
sortd()
elif choice == 6:
total()
elif choice == 7:
show()
else:
print("选择有误,请重新选择!")
continue
def menu():
'''
主菜单函数
'''
print("===============学生信息管理系统================")
print("-------------------功能菜单--------------------")
print("\t1.录入学生信息")
print("\t2.查询学生信息")
print("\t3.删除学生信息")
print("\t4.修改学生信息")
print("\t5.排序")
print("\t6.学生总人数")
print("\t7.显示全部学生")
print("\t0.退出系统")
def get_all():
'''
获取储存的全部学生信息,存放到students列表中,每个列表元素为一个学生信息(格式为字符串)
'''
file = open(filename,'r',encoding='utf-8')
students = file.readlines()
return students
def insert():
'''
添加学生信息的函数
'''
students = [] # 保存输入的所有学生信息,每一条是一个学生的信息,保存在一个字典中
while True:
stu_id = input("录入学生ID:")
if not stu_id:
continue
try:
name = input("录入学生姓名:")
english = int(input("录入英语成绩:"))
python = int(input("录入python成绩:"))
java = int(input("录入java成绩:"))
except:
print("录入的信息有误。")
continue # 重新执行insert()函数
# 将学生信息存入字典中
stu = {'stu_id':stu_id,'name':name,'english':english,'python':python,'java':java}
# 将单个学生信息作为一个列表元素放入列表students中
students.append(stu)
answer = input("是否继续添加y/n:")
if answer == 'y':
continue # 如果继续添加,再次执行insert()函数
else:
break
save(students) # 调用保存数据的函数,将数据写入txt文件
def search():
'''
查询功能
'''
while True:
stu_id = input("输入要查询的学生ID:")
if not stu_id:
print('输入的ID有误,请重新输入。')
continue
else:
try:
file = open(filename,'r',encoding='utf-8')
students = get_all() # 调用get_all函数,获取文件中全部学生信息
except:
print('无学生信息')
break # 文件中没有学生信息,结束本函数,此处可以用return也一样
for stu in students:
stu = eval(stu) # 将学生信息字符串转换成字典
mark = 0
if stu['stu_id'] == stu_id:
print(f'查询到ID为{stu_id}的学生信息')
mark = 1
show(all=0,infos=[str(stu)]) # 调用显示函数
break
if not mark:
print(f'未找到ID为{stu_id}的学生信息')
answer = input('是否继续查询y/n:')
if answer == 'y':
continue
else:
break
def delete():
'''
删除学生信息函数
'''
while True:
students = get_all() # 获取全部学生信息
mark = 0
students_new = [] # 保留删除后的其他学生信息
show() # 显示全部学生信息
stu_id = input("请输入要删除的学生ID:")
if not stu_id:
print("输入有误")
continue # 回到delete函数头部,显示全部学生信息
else:
for stu in students:
stu = eval(stu) # 遍历全部学生信息,匹配要删除的ID值
if stu['stu_id'] == stu_id:
mark = 1 # 如果找到要删除的学生ID,标记mark为1
continue # 要删除的学生信息不放入students_new
else:
students_new.append(stu) # 如果该学生不是要删除的,则放入删除后的学生信息列表中
if not mark:
print(f"未找到ID为{stu_id}的学生信息") # 如果没有做出任何删除,则不保存
else:
print(f'已删除ID为{stu_id}的学生信息')
save(students_new,mode='w') # 如果删除了学生信息,则重新保存剩下的学生信息
answer = input("是否继续删除y/n:")
if answer == 'y':
continue
else:
break
def modify():
'''
修改学生信息函数
'''
show() # 显示全部学生信息
while True:
students_new = [] # 用于保存修改后的全部学生信息
mark = 0 # 修改标记
stu_id = input("请输入要修改的学生ID:")
if not stu_id:
print("输入的ID有误,请重新输入。")
continue
students = get_all()
for student in students:
student = eval(student)
if student['stu_id'] == stu_id:
try:
name = input("录入学生姓名:")
english = int(input("录入英语成绩:"))
python = int(input("录入python成绩:"))
java = int(input("录入java成绩:"))
except:
print("录入的信息有误。")
continue
stu = {'stu_id':stu_id,'name':name,'english':english,'python':python,'java':java}
students_new.append(stu) # 将修改的信息存入修改后的列表中
mark = 1
else:
students_new.append(student)
if mark == 0: # 标记为0,表示没有做任何修改,不做保存动作
print(f"未找到ID为{stu_id}的学生信息")
else:
save(students_new,mode='w') # 如果修改了学生信息,则重新保存全部信息
show() # 再次显示全部学生信息
answer = input("是否继续修改y/n:")
if answer == 'y':
continue
else:
break
def sortd():
'''
学生信息排序
'''
while True:
students_new = [] # 用来保存排好序的学生信息
students = get_all() # 获取全部学生信息
show() # 显示全部学生信息
asc_or_desc = input("请选择1.升序 2.降序:") # 选择排序方式
if asc_or_desc=='1':
asc_or_desc_bool = False
elif asc_or_desc=='2':
asc_or_desc_bool = True
else:
print("您的输入有误。")
sortd() # 重新调用sortd函数,效果与continue一样
sort_mode = int(input("按什么排序1.英语成绩 2.python成绩 3.java成绩 4.总成绩 :"))
for student in students:
# 遍历全部学生信息变为字典,作为单个元素,存入students_new列表中
students_new.append(eval(student))
if sort_mode==1:
# students_new列表调用系统排序函数sort,key表示用来排序的元素,reverse表示排序方式 True降序 False升序
students_new.sort(key=lambda x : int(x['english']),reverse=asc_or_desc_bool)
elif sort_mode==2:
students_new.sort(key=lambda x : int(x['python']),reverse=asc_or_desc_bool)
elif sort_mode==3:
students_new.sort(key=lambda x : int(x['java']),reverse=asc_or_desc_bool)
elif sort_mode==4:
students_new.sort(key=lambda x : int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)
else:
print("输入有误,请重新输入")
# continue
sortd() # 此处递归,效果与continue一样
# 利用列表推导式,将列表students_new中的字典元素转换成字符串,放入show函数进行显示
show(0,[str(stu) for stu in students_new])
answer = input("是否重新排序y/n:")
if answer == 'y':
continue
else:
break
def total():
'''
显示当前学生总人数
'''
students = get_all()
print('当前学生总人数是%s:'%len(students))
def show(all=1,students=[]):
'''
格式化显示函数
all=1显示全部学生信息,all!=1 显示students参数传入的学生信息
students需要显示的学生信息,默认为空,则显示全部学生
'''
# 标题栏格式化显示
format_title = "{:^5}\t{:^6}\t{:^8}\t{:^8}\t{:^8}\t{:^8}"
print(format_title.format('ID','姓名','英语成绩','python成绩','java成绩','总成绩'))
# 数据栏格式化,^5表当前列占5格
format_data = "{:^5}\t{:^6}\t{:^8}\t{:^8}\t{:^8}\t{:^8}"
if all==1:
try:
students = get_all()
except:
print('无学生信息')
for stu in students:
# 遍历需要显示的学生信息,格式化输出,单个学生信息为字符串,需要转换成字典,才能提取具体的数据
stu = eval(stu)
print(format_data.format(stu['stu_id'],stu['name'],stu['english'],stu['python'],stu['java'],stu['english']+stu['python']+stu['java']))
def save(students,mode='a'):
'''
信息保存到本地txt文件的函数
students需要保存的学生信息
mode文件打开方式,默认为a追加,w为重写,r为只读,a+为读写
'''
try:
stu_txt = open(filename,mode,encoding='utf-8')
except:
stu_txt = open(filename,mode,encoding='utf-8')
for stu in students:
# 逐条写入文件,每个学生信息换行写入
stu_txt.write(str(stu)+'\n')
stu_txt.close() # 关闭文件流
if __name__ == '__main__':
main()