清华主页 - 清华新闻 - 综合时讯 - 正文

学生信息管理系统(Python版),2024最新版,流程齐全,快来围观

图标(在figma自己设计的,取青出于蓝之意)🤣SIMS

SIMS学生信息管理系统(Students Information Management System)

前言:

学生信息管理系统为Python基础阶段知识的整合,在这一过程中可以增进对Python数据类型的理解,
也可以对包、模块、函数等的相关知识进行巩固,对基础知识进行复盘,加深对Python语法的理解。

系统开发环境

  • 操作系统: Windows11
  • 开发工具: Pycharm
  • Python解释器版本: Python3.10
  • Python内置模块:os,re

项目目录结构

项目目录结构

需求分析

  • 学生信息管理系统应该具备的功能
    • 添加学生及成绩信息
    • 将学生信息保存到文件当中
    • 修改和删除学生信息
    • 查询学生信息
    • 根据学生成绩进行排序
    • 统计学生的分数

系统设计

项目目录结构

系统业务流程

在这里插入图片描述

主函数设计

主函数设计

编号功能
0退出系统
1录入学生信息,调用insert()函数
2查找学生信息,调用search()函数
3删除学生信息,调用delete()函数
4修改学生信息,调用modify()函数
5对学生成绩排序,调用sort()函数
6统计学生人数,调用total()函数
7显示所有的学生信息,调用show()函数

学生信息维护模块设计

  1. 实现从控制台录入学生信息,并将信息保存到磁盘文件当中

录入信息模块
具体实现

save()函数,用于将学生信息保存到文件
insert()函数,用于记录学生信息

  1. 实现查询学生信息功能

从控制台录入学生ID或姓名,到磁盘文件中找到对应的学生信息
查询信息模块
具体实现

编写主函数中调用的查找学生信息的函数search()
定义显示查询结果的函数show_student(query_student)

3.实现从控制台找到学生信息,并将其删除

删除功能
具体实现

编写主函数中调用的修改学生信息的函数modify()
调用了show()函数显示学生信息

4.实现修改学生信息功能

从控制台录入学生ID,到磁盘文件中找到对应的学生信息,将其进行修改
在这里插入图片描述

5.实现按学生成绩排序功能

主要对学生信息按语文、数学、英语、总成绩进行升序或降序排序
选择0表示升序排序,选择0表示降序排序
选择完排序方式后,实现选择1按照语文成绩排序,选择2按照数学成绩排序,选择3按照英语成绩排序,选择0按总成绩排序
在这里插入图片描述

6.实现统计学生总人数功能

统计学生信息文件中保存的学生信息个数
统计人数模块

具体实现:
利用对列表的长度的计算,因为列表内的每个学生信息都是一个字典,所以有几个字典就有几条学生信息,即有几个学生

7.显示所有学生信息的功能

将学生信息文件中保存的全部学生信息获取并展示
显示信息模块

项目打包

  • 安装第三方模块

在线安装方式
– pip install PyInstaller

  • 执行打包操作
pyinstaller --onefile --icon=SIMS_ver1.0\SIMS.ico --clean sims.py

全部代码

# editor: 百年# time: 2024/1/26 11:39# 定义要保存成的文件importos.pathfile_name='D:/PYWORK/python_cases/1学生信息管理系统/SIMS_ver1.0/stu_info.txt'# 定义主函数func_lst =[i fori inrange(0,8)]defmain():whileTrue:#循环执行menu()choice=int(input('请选择功能:'))ifchoice infunc_lst:ifchoice==0:answer=input('确定退出吗?')ifanswer =='y'oranswer =='Y':print('感谢使用')breakelifanswer =='N'oranswer =='n':continueelifchoice ==1:insert()elifchoice ==2:search()elifchoice ==3:delete()elifchoice ==4:modify()elifchoice ==5:sort()elifchoice ==6:total()elifchoice ==7:show()else:print('请输入正确的数字')continue# 定义一个函数,实现菜单界面defmenu():print("===============++=SIMS=++=================")print("==============学生信息管理系统==================\n")print("|-----------功能菜单---------------|")print("1.\t\t\t\t\t\t录入学生信息\n2.\t\t\t\t\t\t查找学生信息\n3.\t\t\t\t\t\t删除学生信息\n""4.\t\t\t\t\t\t修改学生信息\n5.\t\t\t\t\t\t对学生成绩进行排序\n6.\t\t\t\t\t\t统计学生人数\n7.\t\t\t\t\t\t显示所有的学生信息\n")# 定义一个save函数,用于存储信息defsave(lst):try:fp=open(file_name,'a',encoding='utf-8')except:# fp=open('D:/PYWORK/python_cases/1学生信息管理系统/SIMS_ver1.0/stu_info.txt','w',encoding='utf-8')fp=open(file_name,'w',encoding='utf-8')foritem inlst:#遍历列表中的每个学生的信息(字典形式)并写入到文件当中并换行fp.write(str(item)+'\n')#将每个学生信息的字典写入到列表当中并换行,这样方便后续的查找工作#关闭文件fp.close()# 1实现插入信息功能definsert():# 创建一个空列表用于接收字典元素stu_lst=[]whileTrue:#循环输入id=input('请输入学生id(如1001):')# 空字符串的布尔值为False,所以if not id 即如果字符串为空则提示重新输入ifnotid:print('请重新输入')breakname=input('请输入学生姓名:')ifnotname:print('请重新输入')breaktry:chinese=int(input('语文成绩:'))math=int(input('数学成绩:'))english=int(input('英语成绩:'))except:print('请重新输入正确的成绩')continue#将每个学生的信息保存为字典形式并存入列表中stu_info={ 'id':id,'姓名':name,'语文':chinese,'数学':math,'英语':english}stu_lst.append(stu_info)#向列表中新增元素(单个学生信息的字典)answer=input('是否继续添加?')ifanswer =='y'oranswer =='Y':continueelse:print('学生信息录入完毕!')break# 调用save()函数save(stu_lst)# 2实现查找学生信息功能defsearch():# 创建一个空列表用于接收数据stu_query=[]# 循环执行whileTrue:# 创建id,nameid=''name=''# 如果文件存在ifos.path.exists(file_name):# 定义查找模式mode,可按id和姓名进行自定义查询mode=input('按ID查找请按1,按姓名查找请按2:')ifmode =='1':id=input('请输入要查找的学生的ID:')elifmode =='2':name=input('请输入学生的姓名:')# 如果均未查找到,则输出提示信息有误无法查询else:print('所输入的信息无法识别,请重新输入')search()#如果输入有误,则重新调用自己withopen(file_name,'r',encoding='utf-8')asrfp:stu_info=rfp.readlines()foritem instu_info:d=dict(eval(item))ifid!='':#如果输入的id不为空ifd['id']==id:#且查找到对应的IDstu_query.append(d)#就将这一字典加入到创建的列表stu_query当中elifname!='':#如果输入的姓名不为空,ifd['姓名']==name:#且找到对应的姓名stu_query.append(d)#就将这一字典加入到创建的列表stu_query当中#     显示查询结果(方案1),简单,但也简陋#     print(stu_query)#     answer=input('是否继续查找(y/n)?')#     if answer=='y' or answer == 'Y':#         stu_query.clear() #先清空列表中的数据,否则会出现多个信息#         continue#     elif answer=='n' or answer =='N':#         break# 方案2,调用自己编写的函数show_student()show_student(stu_query)stu_query.clear()#查询时防止有冗余的数据,展示完查找到的信息后对其进行清空,以免出现上次查找的结果answer=input('是否继续查询?(y/n)')ifanswer =='y'oranswer =='Y':continueelifanswer =='N'oranswer =='n':breakelse:print('暂未保存学员信息')return#      开始定义search()模块# 3实现删除学生信息功能defdelete():whileTrue:#循环执行stu_id=input('请输入要删除学生的id:')# 如果不为空字符串ifstu_id!='':# 操作文件# 如果存在ifos.path.exists(file_name):# 则读取文件withopen(file_name,'r',encoding='utf-8')asfp:# readlines()会把读取到的每行元素保存为一个列表# 将读取到的数据保存为一个列表stu_info_oldstu_info_old=fp.readlines()else:#如果没读取到则将stu_info_old置为空列表(默认值为False)stu_info_old=[]#创建一个变量名为flag的对象,默认值为Falseflag=False#用于标记信息是否删除,默认没有删除ifstu_info_old:#相当于True,即stu_info_old里是有内容的# 就以写模式打开文件withopen(file_name,'w',encoding='utf-8')aswfp:# 创建空字典emp_d,用于接收读取到的内容,将其转换为字典# emp_d={ }# 遍历列表中的元素(之前在insert()模块中知道它的元素是一个个字典)foritem instu_info_old:d=dict(eval(item))#空字典#将读取到的字符串转化为字典类型# 这里注意,因为从文件中读取到的虽然貌似是字典,但其实在文件处理器看来就是字符串,# eval()可以将 "{ 'id': '1020', '姓名': '柳传至', '语文': 100, '数学': 100, '英语': 20}"# 消除掉外边的""# 注意,eval()一定要谨慎使用,十分“危险”ifd['id']!=stu_id :#如果字典中的id与输入的id不相同wfp.write(str(d)+'\n')#就先把这条内容写入到文件当中去else:#否则(即输入的id与字典中的id相同)flag=True#则标志删除(即要被删除掉了)ifflag==True:print('id为{ 0}的学生信息已被成功删除'.format(stu_id))else:#即flag=Falseprint('没有找到id为:{ 0}的学生'.format(stu_id))else:#如果没有读到数据print('无学生信息')breakshow()#删除完毕后重新显示学生信息answer=input('是否继续删除(y/n)?')ifanswer=='y'oranswer=='Y':continueelifanswer=='n'oranswer=='N':break# 4实现修改学生功能defmodify():show()#先调用show()函数显示所有学生的信息以便进行修改ifos.path.exists(file_name):#先判断文件是否存在,如果存在,withopen(file_name,'r',encoding='utf-8')asrfp:#则以只读方式打开stu_old=rfp.readlines()#保存为列表形式else:#如果不存在return#则结束(不存在则谈不上修改)# 开始定义modify模块stu_id=input('请输入要修改的学生的ID:')withopen(file_name,'w',encoding='utf-8')aswfp:foritem instu_old:d=dict(eval(item))ifd['id']==stu_id:#如果查找到要修改的id,则修改它print('找到学生信息,可以修改其相关信息!')whileTrue:try:d['姓名']=input('请输入姓名:')d['语文']=int(input('请输入语文成绩:'))d['数学']=int(input('请输入数学成绩:'))d['英语']=int(input('请输入英语成绩:'))except:print('请重新输入')else:breakwfp.write(str(d)+'\n')#如果录入的信息无误,则写入文件当中print('修改成功!!')else:#否则写回原来的内容wfp.write(str(d)+'\n')answer=input('是否继续修改其它学生信息?')ifanswer =='y'oranswer=='Y':#如果选择是,则重新调用modify()elifanswer=='n'oranswer=='N':print('修改完毕')# 5实现对学生信息进行排序的功能defsort():# show() #调用show()展示学生信息ifos.path.exists(file_name):#如果文件存在withopen(file_name,'r',encoding='utf-8')asrfp:#则以只读方式打开文件stu_info=rfp.readlines()#并将读取到的数据(列表中的元素,即每个学生的字典)stu_info_new=[]#创建空列表用于接收信息foritem instu_info:#遍历列表stu_info中的元素d=dict(eval(item))#并将元素的字符串类型转化为字典类型(tips:eval()“去皮”)stu_info_new.append(d)#并将其新增到列表当中else:#否则print('文件不存在')#输出文件不存在returnasc_or_desc=input('请选择排序方式(0升序,1降序):')#定义选项ifasc_or_desc=='0':asc_or_desc_bool=False#定义标志位,如果选0则表示falseelifasc_or_desc=='1':asc_or_desc_bool=True#如果选1则标志Trueelse:print('您的输入有误,请重新输入')sort()mode=input('请选择排序方式(1.语文,2.数学,3.英语,0.总成绩):')# 利用匿名函数获取列表中元素(字典)中的指定的键的值ifmode=='1':stu_info_new.sort(key=lambdax :int(x['语文']),reverse=asc_or_desc_bool)elifmode=='2':stu_info_new.sort(key=lambdax :int(x['数学']),reverse=asc_or_desc_bool)elifmode=='3':stu_info_new.sort(key=lambdax :int(x['英语']),reverse=asc_or_desc_bool)elifmode=='0':stu_info_new.sort(key=lambdax :int(x['语文']+x['数学']+x['英语']),reverse=asc_or_desc_bool)else:print('输入有误,请重新输入,您输入的是{ 0}'.format(mode))sort()#有误后,再次调用show_student(stu_info_new)#调用show_student()展示学生信息# 6实现统计学生总人数功能deftotal():ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asrfp:students=rfp.readlines()ifstudents!='':#如果列表不为空print('一共有{ 0}名学生'.format(len(students)))#则调用len()方法获取列表长度#             为什么要用len(),因为列表内的元素是一个个字典,即一条字典就是一个元素,利用len()便可获取有多少个元素,即多少个学生else:print('没有学生数据')else:print('没有学生数据')# 7实现展示学生信息的功能defshow():# 创建空列表用于接收数据stu_lst=[]ifos.path.exists(file_name):#判断文件是否存在withopen(file_name,'r',encoding='utf-8')asrfp:#如果文件存在stu_info=rfp.readlines()#则以只读方式读取文件并调用readliines()方法,返回的就是一个列表foritem instu_info:#对列表中的元素进行遍历,d=dict(eval(item))#之后将列表中的每个元素(即字符串格式的字典)转化为字典格式stu_lst.append(d)#之后新增到列表stu_lst之中去ifstu_lst!='':#如果列表不为空,show_student(stu_lst)#就调用show_student()函数将信息展示出来else:print('暂未保存学生数据')# 定义一个函数显示读取到的学生信息列表defshow_student(lst):iflen(lst)==0:#如果lst长度为0(即未读取到)print('没有查询到信息,无数据显示!!')return#定义标头显示格式format_title='{ :^6}\t{ :^12}\t{ :^8}\t{ :^8}\t{ :^8}\t{ :^10}'print(format_title.format('id','姓名','语文','数学','英语','总成绩'))#定义内容的显示格式format_data='{ :^6}\t{ :^12}\t{ :^10}\t{ :^10}\t{ :^10}\t{ :^10}'foritem inlst:print(format_data.format(item.get('id'),item.get('姓名'),item.get('语文'),item.get('数学'),item.get('英语'),int(item.get('语文')+item.get('数学')+item.get('英语'))))# 以主程序方式运行if__name__ =='__main__':main()

运行截图

在这里插入图片描述

后记

写下来还是有收获的,至少是一套完整的流程,希望各位看官支持

2025-06-24 11:53:12

相关新闻

清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.