图标(在figma自己设计的,取青出于蓝之意)🤣
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()函数 |
学生信息维护模块设计
- 实现从控制台录入学生信息,并将信息保存到磁盘文件当中

具体实现
save()函数,用于将学生信息保存到文件
insert()函数,用于记录学生信息
- 实现查询学生信息功能
从控制台录入学生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
全部代码
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('请输入正确的数字')continuedefmenu():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")defsave(lst):try:fp=open(file_name,'a',encoding='utf-8')except:fp=open(file_name,'w',encoding='utf-8')foritem inlst:fp.write(str(item)+'\n')fp.close()definsert():stu_lst=[]whileTrue:id=input('请输入学生id(如1001):')ifnotid:print('请重新输入')breakname=input('请输入学生姓名:')ifnotname:print('请重新输入')breaktry:chinese=int(input('语文成绩:'))math=int(input('数学成绩:'))english=int(input('英语成绩:'))except:print('请重新输入正确的成绩')continuestu_info={ 'id':id,'姓名':name,'语文':chinese,'数学':math,'英语':english}stu_lst.append(stu_info)answer=input('是否继续添加?')ifanswer =='y'oranswer =='Y':continueelse:print('学生信息录入完毕!')breaksave(stu_lst)defsearch():stu_query=[]whileTrue:id=''name=''ifos.path.exists(file_name):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!='':ifd['id']==id:stu_query.append(d)elifname!='':ifd['姓名']==name:stu_query.append(d)show_student(stu_query)stu_query.clear()answer=input('是否继续查询?(y/n)')ifanswer =='y'oranswer =='Y':continueelifanswer =='N'oranswer =='n':breakelse:print('暂未保存学员信息')returndefdelete():whileTrue:stu_id=input('请输入要删除学生的id:')ifstu_id!='':ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asfp:stu_info_old=fp.readlines()else:stu_info_old=[]flag=Falseifstu_info_old:withopen(file_name,'w',encoding='utf-8')aswfp:foritem instu_info_old:d=dict(eval(item))ifd['id']!=stu_id :wfp.write(str(d)+'\n')else:flag=Trueifflag==True:print('id为{ 0}的学生信息已被成功删除'.format(stu_id))else:print('没有找到id为:{ 0}的学生'.format(stu_id))else:print('无学生信息')breakshow()answer=input('是否继续删除(y/n)?')ifanswer=='y'oranswer=='Y':continueelifanswer=='n'oranswer=='N':breakdefmodify():show()ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asrfp:stu_old=rfp.readlines()else:returnstu_id=input('请输入要修改的学生的ID:')withopen(file_name,'w',encoding='utf-8')aswfp:foritem instu_old:d=dict(eval(item))ifd['id']==stu_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('修改完毕')defsort():ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asrfp:stu_info=rfp.readlines()stu_info_new=[]foritem instu_info:d=dict(eval(item))stu_info_new.append(d)else:print('文件不存在')returnasc_or_desc=input('请选择排序方式(0升序,1降序):')ifasc_or_desc=='0':asc_or_desc_bool=Falseelifasc_or_desc=='1':asc_or_desc_bool=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)deftotal():ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asrfp:students=rfp.readlines()ifstudents!='':print('一共有{ 0}名学生'.format(len(students)))else:print('没有学生数据')else:print('没有学生数据')defshow():stu_lst=[]ifos.path.exists(file_name):withopen(file_name,'r',encoding='utf-8')asrfp:stu_info=rfp.readlines()foritem instu_info:d=dict(eval(item))stu_lst.append(d)ifstu_lst!='':show_student(stu_lst)else:print('暂未保存学生数据')defshow_student(lst):iflen(lst)==0:print('没有查询到信息,无数据显示!!')returnformat_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()
运行截图

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