Python之学生信息管理系统
小白学习python总会感觉有些迷茫,我就是其中之一,最近在B站看了一个关于python入门的视频(链接在这里),其中的学生信息管理系统可谓对了我这个小白的胃口,在这里跟大家分享一下。
def menu():
print("=========================学生信息管理系统============================")
print("----------------------------功能菜单-----------------------------")
print(" 1.录入学生信息")
print(" 2.查找学生信息")
print(" 3.删除学生信息")
print(" 4.修改学生信息")
print(" 5.排序")
print(" 6.统计学生总人数")
print(" 7.显示所有学生信息")
print(" 0.退出")
print(" y = yes, n = no")
print("-----------------------------------------------------------------")
按照主菜单的提示,在main函数的定义对应的函数内联代码片
。
def main():
while True:
menu()
chioce = int(input("请选择"))
if chioce in range(0,8):
if chioce == 0 :
ans = input("您确定要退出系统吗?")
if ans == 'y' or ans == 'Y':
print("谢谢使用")
break #退出系统
else:
continue
elif chioce == 1:
insert() #录入学生信息
elif chioce == 2:
search() #查找学生信息,下面以此类推
elif chioce == 3:
delete()
elif chioce == 4:
modify()
elif chioce == 5:
sort()
elif chioce == 6:
total()
elif chioce == 7:
show()
filename是储存学生信息的文本文件,os(pycharm自带)在后面会用到,用来查看文件是否存在 内联代码片
。
import os
filename = 'stu.txt'
以下的函数我不分特定顺序的依次给出,先看insert()–录入学生信息内联代码片
。
def insert():
studentlist = []
while True:
id = input("请输入id(如1001):")
if not id: #利用布尔值直接判断
break
name = input("请输入姓名:")
if not name:
break
try:
eng = int(input("请输入英语成绩:")) #类型的转换
python = int(input("请输入python成绩:"))
java = int(input("请输入java成绩:"))
except:
print("输入的成绩无效!!")
print("请确保是整数") #上面都转化为了int
continue #回到上一个循环--while True
#将录入的学生信息保存到字典中
student = {"id":id,"name":name,"eng":eng,"python":python,"java":java}
studentlist.append(student) #将该学生的信息添加到list中
ans = input("是否继续添加?y/n\n") #询问用户是否还需要录入信息
if ans == 'y' :
continue
else :
break
#现在进行储存--save
save(studentlist)
print("学生信息录入完毕")
保存在文件中,注意’encoding=‘一定要写,否则报错。说到文件,本题 多次运用到寻找–with open文件 内联代码片
。
def save(list):
try:
stu_txt = open(filename,'a',encoding='utf-8') #最后的这个防止中文乱码
except:
stu_txt = open(filename,'w',encoding='utf-8')
pass
for item in list:
stu_txt.write(str(item)+'\n') #写入并且转化成str
stu_txt.close() #最后关闭文件
搜索学生信息的函数 内联代码片
。
def search():
student_q = []
while True:
id = ''
name = ''
if os.path.exists(filename):
mode = input("从id查找(1)还是从姓名查找(2)?") #注意输入的是str
if mode == '1' :
id = input("请输入要查询的学生的id:")
elif mode == '2':
name = input("请输入要查询的学生的姓名:")
else:
print("输入不正确,请重新输入!")
search() #重新调用自己这个函数,回到第一步,在此处相当于continue
with open(filename,'r',encoding='utf-8') as rfile :
student = rfile.readlines() #这个程序都是--读取然后遍历,还需要转化为dict
for item in student:
d = dict(eval(item))
if id !='':
if d['id'] == id:
student_q.append(d)
elif name !='':
if d['name'] == name:
student_q.append(d)
show_stu(student_q)
#清空列表student_q
student_q.clear()
ans = input("是否要继续查询?y/n\n")
if ans == 'y' or ans == 'Y':
continue #回到while True
else:
break
else:
print("暂未查询到学生信息")
return
删除信息的函数,这里我没有在每个必要的地方都加上try excption,所以输入一些无关的int会报错 内联代码片
。
def delete():
while True:
student_id = input("请输入要删除的学生的id")
if student_id != '':
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as file:
student_old = file.readlines()
else:
student_old = []
flag = False #标记是否删除,默认没有删除
if student_old :
with open(filename,'w',encoding='utf-8') as wfile: #这里千万注意:encoding=一定要写,否则报错
d = {}
for item in student_old:
d = dict(eval(item)) #遍历出的是str,需要化为字典才能与原文件对应
if d['id'] != student_id:
wfile.write(str(d)+'\n')
else:
flag = True #通过一个中间变量来决定是否已经删除
if flag :
print(f"id 为{student_id}的学生信息已经被删除")
else:
print(f"没有找到id为{student_id}的学生,请检查")
else:
print("暂无学生信息")
break #直接退出while True
show() #重新显示学生信息
ans = input("是否继续删除?y/n\n")
if ans == 'y' or ans == 'Y':
continue
else:
break
修改信息的函数内联代码片
。
def modify():
show()
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
student_old = rfile.readlines()
else:
return #直接结束函数
student_id = input("请输入要修改的学生的id")
with open(filename,'w',encoding='utf-8') as wfile:
for item in student_old:
d = dict(eval(item))
if d['id'] == student_id:
print("已找到改学生信息,现在可以修改学生信息了")
while True:
try :
d['name'] = input("请输入学生的姓名:")
d['eng'] = input("请输入英语成绩:")
d['python'] = input("请输入python成绩:")
d['java'] = input("请输入java成绩:")
except:
print("输入有误,请重新输入:")
else:
break
wfile.write(str(d)+'\n')
print("修改成功")
else :
wfile.write(str(d)+'\n')
ans = input('是否继续修改其他学生信息(若没有修改成功请检查id是否正确)?y/n\n') #注意要是乱输的话会直接到这一步
if ans == 'y' or ans == 'Y':
modify()
#这里大体上看是顺序结构,所以不需要else一样结束这个函数
排序的函数,这里不关注如何排序,而关注如何获取待排序的信息。会用到匿名函数–lambda,具体用法见本段代码,其中因为是student_new下的方法,所以里面的x写成什么都可以,x[’’]则是在字典里索引内联代码片
。
#python的排序相对于C语言可以说十分简单,关键在于读取所需要的文件中的信息
def sort():
show()
if os.path.exists(filename) : #判断文件在磁盘上是否存在
with open(filename,'r',encoding='utf-8') as rfile:
student_lst = rfile.readlines()
student_new = []
for item in student_lst:
d = dict(eval(item))
student_new.append(d)
else:
return
choice = input("请选择:升序(0)降序(1)")
if choice == '0' :
cbool = False #这里的cbool的真假是为了与列表的sort方法的reverse保持一致
elif choice == '1':
cbool = True
else:
print("输入有误,请重新输入")
sort()
mode = input("请选择排序方式:1-英语成绩 2-python成绩 3-Java成绩 0-总成绩排序")
if mode == '1':
student_new.sort(key=lambda x : int(x['eng']),reverse=cbool)
elif mode == '2':
student_new.sort(key=lambda x : int(x['python']),reverse=cbool)
elif mode == '3':
student_new.sort(key=lambda x : int(x['java']),reverse=cbool)
elif mode == '0':
student_new.sort(key=lambda x : int(x['eng']) + int(x['java']) + int(x['python']),reverse=cbool)
else:
print("请重新选择")
sort() #这种方式在程序不大时比较方便,但是一旦程序较大会使得程序反复从初始位置开始,用户体验不佳
show_stu(student_new)
统计总数 内联代码片
。
def total():
#统计学生人数的实质是统计列表长度,此处只是最简单的统计,没有考虑如:学生信息重复等问题
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
student = rfile.readlines()
if student : #布尔运算
print(f'--------一共有{len(student)}名学生---------')
else:
print("还没有录入学生信息")
else:
print("暂未找到相应的文件")
上面有一个show_stu还没定义 内联代码片
。
def show_stu(lst):
if len(lst) == 0: #这个列表的每一项都是字典
print("未查询到学生信息")
return
# 定义标题和内容的显示
format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
print(format_title.format('ID','姓名','英语成绩','python成绩','java成绩','总成绩'))
format_data ='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
for item in lst:
print(format_data.format(item.get('id'),
item.get('name'),
item.get('eng'),
item.get('python'),
item.get('java'),
int(item.get('eng'))+int(item.get('java'))+int(item.get('python')))) #括号看不清了,写出多列方便观察
在show函数中可以调用show_stu,不必再定义内联代码片
。
def show():
student_lst = []
if os.path.exists(filename):
with open(filename,'r',encoding='utf-8') as rfile:
students = rfile.readlines()
for item in students:
student_lst.append(eval(item))
if student_lst:
show_stu(student_lst) #单个的可以在这里用,参数是列表,会返回列表的对应表格
else:
print("还未创建文件,请先保存文件")
最后写上下面的代码就可以用了(可以在python 3.9中运行) 内联代码片
。
if __name__ == '__main__':
main()