Python实现的学生信息管理系统
引言
学完了Python的基础知识,那必然要通过实践来巩固一下,通过软件开发,进一步掌握并加强软件工程的方法和技术,提高自己的软件开发实际能力,提高自己的创造能力、工程设计能力、解决问题能力、综合分析能力以及锻炼自己创造性的思维。为此,我们制作了一个非常简单的学生信息管理系统
功能需求
该系统主要实现以下功能:
1.录入学生信息
2.查找学生信息
3.删除学生信息
4.修改学生信息
5.排序
6.统计学生总人数
7.查看学生信息
2.1 功能菜单的实现
在系统运行过程中,始终为用户展示功能菜单,以便用户操作。
我们设计一个menu()函数,来展示功能菜单。
defmenu():print("================================学生信息管理系统====================================")print('------------------------------------功能菜单---------------------------------------')print('\t\t\t\t\t\t1.录入学生信息')print('\t\t\t\t\t\t2.查找学生信息')print('\t\t\t\t\t\t3.删除学生信息')print('\t\t\t\t\t\t4.修改学生信息')print('\t\t\t\t\t\t5.排序')print('\t\t\t\t\t\t6.统计学生总人数')print('\t\t\t\t\t\t7.查看学生信息')print('\t\t\t\t\t\t0.退出系统')print('---------------------------------------------------------------------------------')
菜单函数实现完成后,如何选择我们的功能呢?下面就看一下我们的控制流程
defmain():whileTrue:
menu()try:
choice=int(input('请选择'))if choiceinrange(8):if choice==0:print('感谢您的使用!')breakelif choice==1:
insert()elif choice==2:
search()elif choice==3:
delete()elif choice==4:
update()elif choice==5:
sort()elif choice==6:
total()elif choice==7:
show()else:print("您的输入有误,请重新输入")except:print("您的输入有误,请重新输入")if __name__=='__main__':
main()
是不是很简单呢?
下面就开始实现本系统的第一个功能吧
2.2 录入学生信息
针对我们输入的数据,我们会把它存储在我们的磁盘上,因此创建一个save()函数来完成这个操作
先说一下我们的这个save(lst)函数,需传入一个list列表类型的参数lst,因为我们的每一条学生信息都是作为字典类型存储在列表中的。
声明:这里的fileName是我们提前定义好的文件名称
fileName='student.txt'
这样再来看我们的save函数,是不是顺眼了许多呢?
defsave(lst):# 读取磁盘学生列表的内容try:file=open(fileName,'a', encoding='utf-8')except:# 文件不存在,以写的方式创建文件file=open(fileName,'w', encoding='utf-8')for studentin lst:# 将每行的数据转化为字符串file.write(str(student)+'\n')file.close()print("学生信息录入完毕!!!")
有了save(lst)函数,下面就可以写我们的insert()函数来录入学生信息了
需注意:学号、姓名不能为空,学生的成绩必须为整数类型,否则会抛出异常重新输入。
definsert():
studentList=[]whileTrue:
stuNo=input("请输入学生的ID:")ifnot stuNo:print("学生的ID不能为空,请重新输入")continue
stuName=input("请输入学生的姓名:")ifnot stuName:print("学生的姓名不能为空,请重新输入")continuewhileTrue:try:
java=int(input("请输入学生的Java成绩:"))
python=int(input("请输入学生的Python成绩:"))
cc=int(input("请输入学生的C++成绩:"))except:print("学生的成绩必须为整数,请重新输入")continueelse:break# 将录入的学生信息保存在字典中
student={'id': stuNo,'name': stuName,'java': java,'python': python,'cc': cc}# 将学生信息添加在列表中
studentList.append(student)
answer=input("是否继续录入学生信息y/n\n")if answer=='y'or answer=='Y':continueelse:break# 将录入的信息存入磁盘中
save(studentList)
当学生信息都存储在studentList列表中后,在代码段的最后调用我们创建好的save(lst)函数将学生信息存储在磁盘中即可。
录入数据后查看一下我的磁盘文件student.txt
2.3 删除学生信息
若要删除学生信息,那么肯定少不了读取磁盘文件,这就需要我们引入os模块来判断磁盘文件是否存在
引入os模块的命令:import os
defdelete():whileTrue:id=input("请输入你要删除的学生ID")# 判断磁盘文件是否存在ifid:if os.path.exists(fileName):# 从磁盘文件中读取文件withopen(fileName,'r', encoding='utf-8')asfile:
studentList=file.readlines()else:print("磁盘中无任何学生信息")break
flag=False# 判断是否删除学生记录if studentList:withopen(fileName,'w', encoding='utf-8')asfile:for studentin studentList:#将字符串类型的student转化为字典类型
student=eval(student)if student['id']!=id:file.write(str(student)+'\n')else:
flag=Trueif flag:print(f"学号为{id}的学生信息删除成功")breakelse:print(f"没有找到学号为{id}的学生")
show()else:print("输入的学生ID不能为空,请重新输入")continue
answer=input("是否继续删除学生信息y/n\n")if answer=='y'or answer=='Y':continueelse:break
在这里我们使用了一个with语句,使用with语句的好处就在于不用我们手动关闭文件流。
引入一个博主的话就是:with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
如果仍然对with语句留有疑惑,那么可以去参考这篇博客:https://www.cnblogs.com/xiaxiaoxu/p/9747551.html,相信你会有更加深刻的理解!
2.4 修改学生信息
实现这个功能的一个基本思想就是:
从磁盘读取文件,依次遍历数据,如果数据项的id与输入的要修改学生的id相同,则修改他的信息并写入磁盘文件,如果id不同,则将原信息写入文件。
defupdate():
show()whileTrue:# 先从磁盘读取学生信息if os.path.exists(fileName):withopen(fileName,'r', encoding='utf-8')asfile:
studentList=file.readlines()else:print("磁盘中不存在学生信息\n")breakid=input("请输入要修改的学生ID")
flag=False# 判断是否存在学号为id的学生信息ifid:withopen(fileName,'w', encoding='utf-8')asfile:for studentin studentList:# 将学生信息转化为字典类型
student=eval(student)if student['id']==id:
flag=Trueprint(f"找到学号为{id}的学生了,可以进行修改")whileTrue:try:
student['name']=input("请输入学生的姓名")ifnot student['name']:print("学生的姓名不能为空,请重新输入")continue
student['java']=int(input("请输入学生的Java成绩:"))
student['python']=int(input("请输入学生的Python成绩:"))
student['cc']=int(input("请输入学生的C++成绩:"))breakexcept:print("你的输入有误,请重新输入")file.write(str(student)+'\n')else:print("学生的id不能为空,请重新输入")continueifnot flag:print(f"不存在学号为{id}的学生")else:print("学生信息修改完毕!!!")
answer=input("是否继续修改学生信息y/n\n")if answer=='y'or answer=='Y':continueelse:break
2.5 查找学生信息
这里我们提供两种查找方法:
1.根据学生ID查找
2.根据学生姓名查找
当查找完数据后,我们需要对数据进行展示,如果我们直接输出,那么数据必然杂乱无章,影响用户体验,因此我们创建一个show_search(lst)方法为输出的数据加上一定的格式,使输出的数据简洁美观。
# 按照一定格式列出学生信息defshow_search(studentQuery):iflen(studentQuery)==0:print("没有查找到学生信息,无数据显示!!!")# 定义标题显示格式
title_format='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'print(title_format.format('ID','姓名','Java成绩','Python成绩','C++成绩','总成绩'))# 定义数据显示格式
data_format='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}\t'for studentin studentQuery:print(data_format.format(student.get('id'),
student.get('name'),
student.get('java'),
student.get('python'),
student.get('cc'),int(student.get('java'))+int(student.get('python'))+int(student.get('cc'))))
下面给出我们的查找函数search()的相关操作:
defsearch():
studentQuery=[]whileTrue:id=''
name=''if os.path.exists(fileName):
mode=int(input("按ID查找输入1,按姓名查找请按2:"))if mode==1:id=input("请输入要查找学生的id")elif mode==2:
name=input("请输入要查找学生的姓名")else:print("输入格式错误,请重新输入")
search()returnwithopen(fileName,'r', encoding='utf-8')asfile:
studentList=file.readlines()for studentin studentList:
student=eval(student)ifid:if student['id']==id:
studentQuery.append(student)if name:if student['name']== name:
studentQuery.append(student)
show_search(studentQuery)# 清空查找列表
studentQuery.clear()
answer=input("是否继续查找学生信息y/n\n")if answer=='y'or answer=='Y':continueelse:breakelse:print("磁盘上不存在学生信息文件")return
在上面的search()函数中,每当我们调用show_search(lst)函数后,需要清空学生列表数据,这是为了避免再次查找学生信息时,将上一次查找的信息也带了进去,导致程序错乱。
2.6 查找学生总人数
该功能比较简单,只需读取文件,然后遍历数据即可,不再过多简述,直接上代码。
deftotal():if os.path.exists(fileName):withopen(fileName,'r', encoding='utf-8')asfile:
studentList=file.readlines()if studentList:print("共有{0}名学生\n".format(len(studentList)))else:print("还没有录入学生信息\n")else:print("磁盘中没有学生信息文件!!!\n")
2.7 查看学生数据
因为我们已经有了show_search(lst)格式化输出函数,因此我们只要读取文件拿到数据列表,再调用show_search(lst)函数即可。
defshow():
studentQuery=[]if os.path.exists(fileName):withopen(fileName,'r', encoding='utf-8')asfile:
studentList=file.readlines()for studentin studentList:
student=eval(student)
studentQuery.append(student)
show_search(studentQuery)# 清空列表
studentQuery.clear()else:print("磁盘中没有学生信息文件!!!\n")
哈哈,历经艰辛,终于快结束了!!!
别急,坚持一下,做完这个排序函数,才算大功告成。
2.8 排序学生数据
提到排序,那么必然有【升序】【降序】两个选择
其次,要根据什么进行排序吗?也就是我们的排序依据是什么呢?
这里我们给出了四个选择
1. 根据Java成绩排序
2. 根据Python成绩排序
3. 根据C++成绩排序
4. 根据总成绩排序
这里我用到了Python中的一个内置函数sort() ,sort方法还有两个可选参数:key和reverse
key:排序所依据的关键词,在这里我们使用的是lamdba函数,是固定写法,不要写成别的单词,dict表示列表中的一个元素,在这里,表示一个元组,dict只是临时起的一个名字,你可以使用任意的名字;
对lamdba不理解的,参考这个链接:https://www.cnblogs.com/zle1992/p/6271105.html
reverse:reverse指定排序方式,需要提供一个布尔值:True为降序,False为升序
defsort():
show()
studentList=[]if os.path.exists(fileName):withopen(fileName,'r', encoding='utf-8')asfile:
students=file.readlines()for studentin students:
student=eval(student)
studentList.append(student)
ascOrDesc=int(input("请选择(0.升序,1.降序)"))if ascOrDesc==0:
ascOrDescBool=Falseelif ascOrDesc==1:
ascOrDescBool=Trueelse:print("数据输入不合法,请重新输入")
sort()returnwhileTrue:
mode=int(input('请选择排序方式(1.按Java成绩排序 2.按Python成绩排序 3.按C++成绩排序 0.按总成绩排序\n)'))if mode==0:
studentList.sort(key=lambdadict:int(dict['java'])+int(dict['python'])+int(dict['cc']),reverse=ascOrDescBool)elif mode==1:
studentList.sort(key=lambdadict:int(dict['java']),reverse=ascOrDescBool)elif mode==2:
studentList.sort(key=lambdadict:int(dict['python']), reverse=ascOrDescBool)elif mode==3:
studentList.sort(key=lambdadict:int(dict['cc']), reverse=ascOrDescBool)else:print("输入数据不合法,请重新输入")continue
show_search(studentList)break
answer=input("是否继续排序y/n\n")if answer=='y'or answer=='Y':
sort()else:print("磁盘中不存在学生信息\n")
总结
到这里本系统的制作就结束了,这也是本人所写的第一篇博客文章,希望可以帮到那些初学Python的小伙伴们,如果上述代码有任何问题或者疑惑,欢迎大家评论指出,日后一定改进。
今后也会陆续向大家分享自己所学的知识,希望大家关注,不喜勿喷。