python基础实战|Python实现的学生信息管理系统


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
python基础实战|Python实现的学生信息管理系统
文章图片

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的小伙伴们,如果上述代码有任何问题或者疑惑,欢迎大家评论指出,日后一定改进。
今后也会陆续向大家分享自己所学的知识,希望大家关注,不喜勿喷。

    推荐阅读