Python实现的学生信息管理系统

引言

学完了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

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值