Python实现的学生信息管理系统

2022-08-28 14:19:23

引言

学完了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

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的小伙伴们,如果上述代码有任何问题或者疑惑,欢迎大家评论指出,日后一定改进。
今后也会陆续向大家分享自己所学的知识,希望大家关注,不喜勿喷。

  • 作者:哈喽沃德&
  • 原文链接:https://blog.csdn.net/wyjfr/article/details/115529012
    更新时间:2022-08-28 14:19:23