python实现学生管理系统(包含文件操作)
- 前言:这个程序是在B站看相关教程学会的 好歹是敲完了 但是其中也有一些小bug或许没有被发现,并且有的地方还可以精简,发此博客为了记录自己一步步的成长之路~
1.需求分析
首先是学生管理系统的功能,分为7个部分,分别是:
1>录入学生信息、
2>查找学生信息、
3>删除学生信息、
4>修改学生信息、
5>学生排名、
6>统计学生总人数、
7>显示全部学生信息。
2.功能细化
- 录入的学生信息包括含学号,姓名,成绩(英语、数学、C语言、python、Java)
- 查找学生信息可以通过学号查找、也可以通过姓名查找
- 删除、修改学生信息只能通过学号删改
- 排名可以根据成绩(各科成绩、总成绩)排名,或者根据学号排名。排序可以是从大到小,也可以是从小到大。
3.具体实现
import os #引入内置模块
filename='student.txt' #将被创建的储存学生信息的文本文件取名为student.txt
def main():
while True:
menu() #调用菜单函数
choice=int(input('请选择:'))
if choice in [0,1,2,3,4,5,6,7]: #每个数字的功能在下面菜单当中
if choice==0:
answer=input('您确定要退出系统吗?y/n:')
if answer=='y'or answer=='Y':
print('退出成功,感谢您的使用!')
break
else:
continue
elif choice==1:
insert() #插入学生信息
elif choice==2:
search() #查询学生信息
elif choice==3:
delete() #删除学生信息
elif choice==4:
modify() #修改学生信息
elif choice==5:
sort() #对学生信息进行排序
elif choice==6:
total() #统计学生信息总人数
elif choice==7:
show() #显示全部学生信息
else:
continue
#菜单界面
def menu():
print('''
----------------------------------------------------------------------
--------------------------欢迎来到学生信息管理系统--------------------
----------------------------------------------------------------------
1.录入学生信息
2.查找学生信息
3.删除学生信息
4.修改学生信息
5.学生成绩排名
6.统计学生总人数
7.显示全部学生信息
0.退出系统
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------''')
return
#用来将学生信息储存在文本文件中
def save(lst):
try:
stu_txt=open(filename,'a',encoding='utf-8') #以追加方式打开文本文件
except:
stu_txt=open(filename,'w',encoding='utf-8') #如果刚开始没有文本文件,则创建一个文本文件
for item in lst:
stu_txt.write(str(item)+'\n')
stu_txt.close()
#录入学生信息
def insert():
stu_list=[] #创建一个学生信息列表
while True:
id=input('请输入学生ID:')
if not id:
break
name=input('请输入姓名:')
if not name:
break
try:
english=int(input('请输入英语成绩:'))
math=int(input('请输入数学成绩:'))
cguage=int(input('请输C语言成绩:'))
python=int(input('请输入Python成绩:'))
java=int(input('请输入Java成绩:'))
except:
print('输入无效,不是整数类型,请重新输入')
continue
#将录入的学生保存到字典当中
student={'id':id,'name':name,'english':english,'math':math,'cguage':cguage,'python':python,'java':java}
#将学生信息放到列表中
stu_list.append(student)
answer=input('是否继续添加?y/n:')
if answer=='y'or answer=='Y':
continue
else:
break
save(stu_list) #将创建的学生列表传进此函数中保存在文件里
print('学生信息录入完毕!')
return
#查找学生信息
def search():
stu_dply=[] #创建学生列表并且初始化,这个列表就是要被查询的学生列表
#为什么要创建列表?当通过姓名进行查询时,可能会存在同名现象,因此需要列表存储多个学生信息
stu_id=''
stu_name=''
if os.path.exists(filename):
order=int(input('按ID查找请输入1,按姓名查找请输入2:'))
if order==1:
stu_id=input('请输入学生ID:')
elif order==2:
stu_name=input('请输入学生姓名:')
else:
print('What fucking problem with you ???')
search() #调用自己重新输入(有两种方式 循环和递归 这里选择了递归)
with open(filename,'r',encoding='utf-8') as file: #以只读形式打开文本文件
stu_old=file.readlines() #将文件内所有的学生信息储存在stu_old列表里
for item in stu_old: #遍历每个学生的信息
d=dict(eval(item)) #将每个学生信息转换为字典
if stu_id!='': #当输入的要查询的学生信息合法
if d['id']==stu_id: #当字典里的学生信息id跟输入的学生id相同
stu_dply.append(d) #将此学生字典追加到将要展示的学生列表中
elif stu_name!='':
if d['name']==stu_name:
stu_dply.append(d)
#显示查询结果
show_student(stu_dply)
#请空列表
stu_dply.clear()
answer=input('是否继续查询?y/n:')
if answer=='y'or answer=='Y':
search()
else:
print('ojbk!')
return
#删除学生信息
def delete():
while True: #这里用了循环的方式执行可能出现的重复操作,而不是递归
stu_id=input('请输入要删除的学生ID:')
if stu_id!='':
if os.path.exists(filename): #判断学生信息文件是否存在
with open(filename,'r',encoding='utf-8') as file:
stu_old=file.readlines() #readline返回的是字符串 #print(stu_old)
else:
stu_old=[]
flag=False #标记是否删除
if stu_old: #原文件不为空
with open(filename,'w',encoding='utf-8') as wfile:
d={}
for item in stu_old: #item是字符串
d=dict(eval(item)) #将字符串转成字典
if d['id']!=stu_id:
wfile.write(str(d)+'\n')
else:
flag=True #表示不需要删除
if flag:
print(f'id为{stu_id}的学生信息已被删除')
else:
print(f'没有找到id为{stu_id}的学生信息')
else:
print('无该学生信息!')
break
show() #删除之后重新显示所有学生信息
answer=input('是否继续删除学生信息?y/n:')
if answer=='y' or answer=='Y':
continue
else:
break
return
#修改学生信息
def modify():
while True:
stu_id=input('请输入要修改的学生ID:')
if stu_id!='':
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
stu_old=file.readlines()
else:
stu_old=[]
flag=False
if stu_old:
with open(filename,'w',encoding='utf-8') as wfile:
for item in stu_old:
d=dict(eval(item))
if d['id']!=stu_id:
wfile.write(str(d)+'\n')
else:
flag=True
if flag:
print('找到这名学生,可以修改他的相关信息了!')
while True:
d['name']=input('请输入姓名:')
try:
d['english']=int(input('请输入英语成绩:'))
d['math']=int(input('请输入数学成绩:'))
d['cguage']=int(input('请输C语言成绩:'))
d['python']=int(input('请输入Python成绩:'))
d['java']=int(input('请输入Java成绩:'))
print('修改成功!')
break
except:
print('输入无效,不是整数类型,请重新输入')
continue
d['id']=stu_id
wfile.write(str(d)+'\n')
else:
print(f'没有找到id为{stu_id}的学生信息')
show() #修改之后显示所有学生信息
answer=input('是否继续修改其他学生信息?y/n:')
if answer=='y' or answer=='Y':
continue
else:
break
return
#对学生信息排序
def sort():
show()
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
stu_lst=file.readlines()
stu_new=[]
for item in stu_lst:
d=dict(eval(item))
stu_new.append(d)
else:
print('暂未保存学生信息!')
return
order=int(input('请选择(0升序,1降序):')) #False升序,True降序
mode=int(input('请选择排序方式(1.英语成绩,2.数学成绩,3.Python成绩,4.C语言成绩,5.Java成绩,6.总成绩,0.ID):'))
if mode==1:
stu_new.sort(key=lambda i:int(i['english']),reverse=order) #reverse是排序方式 x这个参数是字典
elif mode==2:
stu_new.sort(key=lambda i:int(i['math']),reverse=order)
elif mode==3:
stu_new.sort(key=lambda i:int(i['python']),reverse=order)
elif mode==4:
stu_new.sort(key=lambda i:int(i['cguage']),reverse=order)
elif mode==5:
stu_new.sort(key=lambda i:int(i['java']),reverse=order)
elif mode==6:
stu_new.sort(key=lambda i:int(i['english'])+int(i['math'])+int(i['python'])+int(i['cguage'])+int(i['java']),reverse=order)
elif mode==0:
stu_new.sort(key=lambda i:int(i['id']),reverse=order)
else:
print('输入有误,请重新输入。')
sort()
show_student(stu_new)
return
#统计学生总人数
def total():
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
students=file.readlines()
if students:
print('一共有%d名学生'%len(students))
else:
print('还没有录入学生信息')
else:
print('暂未保存学生信息')
return
#显示全部学生信息
def show():
stu_dply=[]
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
students=file.readlines()
if students:
for item in students:
d=dict(eval(item))
stu_dply.append(d)
show_student(stu_dply)
else:
print('还没有录入学生信息')
else:
print('暂未保存学生信息')
return
#显示学生信息
def show_student(lst):
if len(lst)==0:
print('没有查询到学生信息,无数据显示!')
return
#定义标题显示格式
print('ID\t\t姓名\t\t英语成绩\t数学成绩\tC语言成绩\tPython成绩\tJava成绩\t总成绩\t')
for item in lst:
for index in item:
print(item[index],end='\t\t')
print(item['english']+item['math']+item['cguage']+item['python']+item['java'])
print('按任意键继续')
os.system('pause')
if __name__=='__main__': #以主函数运行
main()