Python实现的学生信息管理系统
- 引言
- 功能需求
-
- 2.1 功能菜单的实现
- 2.2 录入学生信息
- 2.3 删除学生信息
- 2.4 修改学生信息
- 2.5 查找学生信息
- 2.6 查找学生总人数
- 2.7 查看学生数据
- 2.8 排序学生数据
- 总结
引言 学完了Python的基础知识,那必然要通过实践来巩固一下,通过软件开发,进一步掌握并加强软件工程的方法和技术,提高自己的软件开发实际能力,提高自己的创造能力、工程设计能力、解决问题能力、综合分析能力以及锻炼自己创造性的思维。为此,我们制作了一个非常简单的学生信息管理系统
功能需求 该系统主要实现以下功能:
1.录入学生信息
2.查找学生信息
3.删除学生信息
4.修改学生信息
5.排序
6.统计学生总人数
7.查看学生信息
2.1 功能菜单的实现 在系统运行过程中,始终为用户展示功能菜单,以便用户操作。
我们设计一个menu()函数,来展示功能菜单。
def menu():
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('---------------------------------------------------------------------------------')
菜单函数实现完成后,如何选择我们的功能呢?下面就看一下我们的控制流程
def main():
while True:
menu()
try:
choice = int(input('请选择'))
if choice in range(8):
if choice == 0:
print('感谢您的使用!')
break
elif 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函数,是不是顺眼了许多呢?
def save(lst):
# 读取磁盘学生列表的内容
try:
file = open(fileName, 'a', encoding='utf-8')
except:
# 文件不存在,以写的方式创建文件
file = open(fileName, 'w', encoding='utf-8')
for student in lst:
# 将每行的数据转化为字符串
file.write(str(student) + '\n')
file.close()
print("学生信息录入完毕!!!")
有了save(lst)函数,下面就可以写我们的insert()函数来录入学生信息了
需注意:学号、姓名不能为空,学生的成绩必须为整数类型,否则会抛出异常重新输入。
def insert():
studentList = []
while True:
stuNo = input("请输入学生的ID:")
if not stuNo:
print("学生的ID不能为空,请重新输入")
continue
stuName = input("请输入学生的姓名:")
if not stuName:
print("学生的姓名不能为空,请重新输入")
continue
while True:
try:
java = int(input("请输入学生的Java成绩:"))
python = int(input("请输入学生的Python成绩:"))
cc = int(input("请输入学生的C++成绩:"))
except:
print("学生的成绩必须为整数,请重新输入")
continue
else:
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':
continue
else:
break
# 将录入的信息存入磁盘中
save(studentList)
当学生信息都存储在studentList列表中后,在代码段的最后调用我们创建好的save(lst)函数将学生信息存储在磁盘中即可。
录入数据后查看一下我的磁盘文件student.txt
文章图片
2.3 删除学生信息 若要删除学生信息,那么肯定少不了读取磁盘文件,这就需要我们引入os模块来判断磁盘文件是否存在
引入os模块的命令:import os
def delete():
while True:
id = input("请输入你要删除的学生ID")
# 判断磁盘文件是否存在
if id:
if os.path.exists(fileName):
# 从磁盘文件中读取文件
with open(fileName, 'r', encoding='utf-8') as file:
studentList = file.readlines()
else:
print("磁盘中无任何学生信息")
break
flag = False# 判断是否删除学生记录
if studentList:
with open(fileName, 'w', encoding='utf-8') as file:
for student in studentList:
#将字符串类型的student转化为字典类型
student = eval(student)
if student['id'] != id:
file.write(str(student) + '\n')
else:
flag = True
if flag:
print(f"学号为{id}的学生信息删除成功")
break
else:
print(f"没有找到学号为{id}的学生")
show()
else:
print("输入的学生ID不能为空,请重新输入")
continue
answer = input("是否继续删除学生信息y/n\n")
if answer == 'y' or answer == 'Y':
continue
else:
break
在这里我们使用了一个with语句,使用with语句的好处就在于不用我们手动关闭文件流。
引入一个博主的话就是:with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
如果仍然对with语句留有疑惑,那么可以去参考这篇博客:https://www.cnblogs.com/xiaxiaoxu/p/9747551.html,相信你会有更加深刻的理解!
2.4 修改学生信息 实现这个功能的一个基本思想就是:
从磁盘读取文件,依次遍历数据,如果数据项的id与输入的要修改学生的id相同,则修改他的信息并写入磁盘文件,如果id不同,则将原信息写入文件。
def update():
show()
while True:
# 先从磁盘读取学生信息
if os.path.exists(fileName):
with open(fileName, 'r', encoding='utf-8') as file:
studentList = file.readlines()
else:
print("磁盘中不存在学生信息\n")
break
id = input("请输入要修改的学生ID")
flag = False# 判断是否存在学号为id的学生信息
if id:
with open(fileName, 'w', encoding='utf-8') as file:
for student in studentList:
# 将学生信息转化为字典类型
student = eval(student)
if student['id'] == id:
flag = True
print(f"找到学号为{id}的学生了,可以进行修改")
while True:
try:
student['name'] = input("请输入学生的姓名")
if not student['name']:
print("学生的姓名不能为空,请重新输入")
continue
student['java'] = int(input("请输入学生的Java成绩:"))
student['python'] = int(input("请输入学生的Python成绩:"))
student['cc'] = int(input("请输入学生的C++成绩:"))
break
except:
print("你的输入有误,请重新输入")
file.write(str(student) + '\n')else:
print("学生的id不能为空,请重新输入")
continue
if not flag:
print(f"不存在学号为{id}的学生")
else:
print("学生信息修改完毕!!!")
answer = input("是否继续修改学生信息y/n\n")
if answer == 'y' or answer == 'Y':
continue
else:
break
2.5 查找学生信息 这里我们提供两种查找方法:
1.根据学生ID查找
2.根据学生姓名查找
当查找完数据后,我们需要对数据进行展示,如果我们直接输出,那么数据必然杂乱无章,影响用户体验,因此我们创建一个show_search(lst)方法为输出的数据加上一定的格式,使输出的数据简洁美观。
# 按照一定格式列出学生信息
def show_search(studentQuery):
if len(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 student in 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()的相关操作:
def search():
studentQuery = []
while True:
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()
return
with open(fileName, 'r', encoding='utf-8') as file:
studentList = file.readlines()
for student in studentList:
student = eval(student)
if id:
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':
continue
else:
break
else:
print("磁盘上不存在学生信息文件")
return
在上面的search()函数中,每当我们调用show_search(lst)函数后,需要清空学生列表数据,这是为了避免再次查找学生信息时,将上一次查找的信息也带了进去,导致程序错乱。
2.6 查找学生总人数 该功能比较简单,只需读取文件,然后遍历数据即可,不再过多简述,直接上代码。
def total():
if os.path.exists(fileName):
withopen(fileName, 'r', encoding='utf-8') as file:
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)函数即可。
def show():
studentQuery = []
if os.path.exists(fileName):
withopen(fileName, 'r', encoding='utf-8') as file:
studentList = file.readlines()
for student in 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为升序
def sort():
show()
studentList = []
if os.path.exists(fileName):
with open(fileName, 'r', encoding='utf-8') as file:
students = file.readlines()
for student in students:
student = eval(student)
studentList.append(student)
ascOrDesc = int(input("请选择(0.升序,1.降序)"))
if ascOrDesc == 0:
ascOrDescBool = False
elif ascOrDesc == 1:
ascOrDescBool = True
else:
print("数据输入不合法,请重新输入")
sort()
return
while True:
mode = int(input('请选择排序方式(1.按Java成绩排序 2.按Python成绩排序 3.按C++成绩排序 0.按总成绩排序\n)'))
if mode == 0:
studentList.sort(key=lambda dict:int(dict['java'])+int(dict['python'])+int(dict['cc']),reverse=ascOrDescBool)
elif mode == 1:
studentList.sort(key=lambda dict: int(dict['java']) ,reverse=ascOrDescBool)
elif mode == 2:
studentList.sort(key=lambda dict: int(dict['python']), reverse=ascOrDescBool)
elif mode == 3:
studentList.sort(key=lambda dict: 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基础实战|Python实现的学生信息管理系统】到这里本系统的制作就结束了,这也是本人所写的第一篇博客文章,希望可以帮到那些初学Python的小伙伴们,如果上述代码有任何问题或者疑惑,欢迎大家评论指出,日后一定改进。
今后也会陆续向大家分享自己所学的知识,希望大家关注,不喜勿喷。
推荐阅读
- Python 进阶 — Flake8 静态代码检查工具
- 人工智能|智能时尚(人工智能在时尚&服装行业的应用综述 | 580+参考文献)
- python|飞机大战(python)
- python|机器人基本知识和ROS介绍
- 号外!号外!OHOS设备上的完整Python发布了!
- #yyds干货盘点#怎么自学 Python,大概要多久()
- python函数高级
- linux中python导入模块路径
- Python-Mail邮件发送