【Python编程实战】基于Python语言实现学生信息管理系统

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

目录

前言            

正文

01-需求分析            

02-功能演示            

03-录入学生信息功能实现            

04-查找学生信息功能实现            

05-删除学生信息功能实现            

06-修改学生信息功能实现            

07-对学生成绩进行排序功能实现            

08-统计学生总人数功能实现            

09-显示所有学生信息功能实现            

总结 

01-整体代码实现          


前言            

        Python是一种高级编程语言,以其简洁易读的语法而闻名。它支持面向对象、命令式、函数式和过程式编程范式。Python由Guido van Rossum于1991年创立,如今已成为最受欢迎的编程语言之一。它在许多领域得到广泛应用,包括Web开发、科学计算、人工智能、数据分析和自动化脚本等。Python的核心特点包括动态类型、自动内存管理和广泛的标准库,其中包含了许多用于各种任务的模块和功能。Python的生态系统也非常丰富,拥有大量的第三方库和框架,使开发人员能够快速构建复杂的应用程序。

正文

01-需求分析            

        '''学生管理系统应该具备的功能'''
1,添加学生及成绩信息
       2,将学生信息保存在文件中
3,修改和删除学生信息

                                                      4,查询学生信息
                                                      5,根据学生成绩进行排序

                                                      6,统计学生的总分

02-功能演示            

     下面对系统实现的功能进行演示一下,后面会给出分段代码解释和整体代码

        运行之后,界面如下:各种功能选择项

        选择功能1,可以进行添加学生信息操作,如下图所示:添加张三和学号,以及各科成绩,最后可以选择是否继续添加。

        选择功能2,可以进行查询学生信息,如下图所示:两种查询方式

        请选择2
        按学号查找请输入1,按姓名查找请输入22
        请输入要查找学生的姓名:张三
          id           姓名           英语成绩       python成绩       java成绩        总成绩   
         1001          张三            98           96            99          293   
        是否继续执行查询操作?y/n
        y
        按学号查找请输入1,按姓名查找请输入21
        请输入要查找学生的id:1001
          id           姓名           英语成绩       python成绩       java成绩        总成绩   
         1001          张三            98           96            99          293   
        是否继续执行查询操作?y/n

        选择功能4,修改学生信息,如下图所示:

        请输入需要修改学生的id:1002
        找到学生相关信息,可以修改他的相关信息了!!!
        请输入名字:李四
        请输入英语成绩:100
        请输入python成绩:100
        请输入java成绩100
        修改成功
        是否继续修改其他学生的信息?y/n

        选择功能5,学生信息排序,如下图所示:也有多种排序方式

        请选择5
          id           姓名           英语成绩       python成绩       java成绩        总成绩   
         1001          张三            98           96            99          293   
         1002          李四           100          100           100          300   
        请选择(0.升序 1.降序)1
        请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)1
          id           姓名           英语成绩       python成绩       java成绩        总成绩   
         1002          李四           100          100           100          300   
         1001          张三            98           96            99          293   

        选择功能6,统计学生总人数,如下图所示:

         选择功能7,显示所有学生信息,如下图所示:

03-录入学生信息功能实现            

     1,表示录入学生信息,调用insert()函数,函数如下

        代码解释如下:这段代码定义了一个函数insert(),它的作用是用来录入学生信息并将信息保存到一个列表中,最后将列表保存到文件中。:

  1. def insert():: 这是定义一个函数的开始,函数名为insert

  2. student_list = []: 创建一个空列表student_list,用于存储录入的学生信息。

  3. while True:: 进入一个无限循环,用于不断地录入学生信息,直到用户选择退出。

  4. id = input('请输入学号(如1001):'): 提示用户输入学号,并将输入的值赋给变量id

  5. if not id:: 如果学号为空(用户没有输入),则执行break语句退出循环,即结束录入信息操作。

  6. name = input('请输入姓名:'): 提示用户输入姓名,并将输入的值赋给变量name

  7. if not name:: 如果姓名为空(用户没有输入),则执行break语句退出循环,即结束录入信息操作。

  8. try:: 使用try语句开始尝试录入成绩信息,因为成绩有可能录入错误,所以使用异常处理。

  9. english = int(input('请输入英语成绩:')): 提示用户输入英语成绩,并将输入的字符串转换为整数类型,并将其赋给变量english

  10. python = int(input('请输入python成绩:')): 提示用户输入Python成绩,并将输入的字符串转换为整数类型,并将其赋给变量python

  11. java = int(input('请输入Java成绩:')): 提示用户输入Java成绩,并将输入的字符串转换为整数类型,并将其赋给变量java

  12. except:: 如果输入的成绩无效(无法转换为整数),则执行except语句块,打印错误提示信息并继续循环。

  13. student = {'id':id,'name':name,'english':english,'python':python,'java':java}: 将录入的学生信息保存到一个字典student中,包括学号、姓名、英语成绩、Python成绩和Java成绩。

  14. student_list.append(student): 将学生信息字典student添加到列表student_list中。

  15. anewer = input('是否继续添加?y/n\n'): 提示用户是否继续添加学生信息,用户输入y表示继续,输入其他任意值表示退出。

  16. if anewer=='y': continue else: break: 根据用户输入的选择,如果是y则继续循环,否则执行break语句退出循环。

  17. 最后,如果退出循环,即用户不再添加学生信息,则调用一个未定义的save()函数来保存学生信息到文件中(你需要自行定义该函数),并输出"学生信息录入完毕!!!"的提示信息。

def insert():  # 定义insert()函数,录入学生信息
    student_list = []  # 创建一个列表,用于存储录入的学生信息
    while True:  # 循环录入学生信息
        id = input('请输入学号(如1001):')
        if not id:  # 如果没有输入学号或者输入错误,则执行break,退出录入信息操作
            break
        name = input('请输入姓名:')
        if not name:  # 如果是空的,则执行break
            break

        #  然后开始录入成绩信息,但是成绩有可能录入错误,因此用try...except...保证异常处理
        try:
            english = int(input('请输入英语成绩:'))
            python = int(input('请输入python成绩:'))
            java = int(input('请输入Java成绩:'))
        except:  #当你输入的成绩无效时,会执行except语句
            print('输入无效,不是整数类型,请重新输入')
            continue
        # 将录入的学生信息保存到字典
        student = {'id':id,'name':name,'english':english,'python':python,'java':java}
        # 将学生信息添加到列表中
        student_list.append(student)
        anewer = input('是否继续添加?y/n\n')
        if anewer=='y':
            continue
        else:
            break2

    # 信息添加之后,将信息保存到文件中,需要退出循环
    # 调用save()函数,保存信息
    save(student_list)  # save()函数未定义,需要自行定义
    print('学生信息录入完毕!!!')

04-查找学生信息功能实现            

     2,表示查找学生信息,调用search()函数,函数如下

        代码解释如下:这段代码定义了一个名为search()的函数,其作用是用于查找学生信息。

  1. def search():: 这是定义一个函数的开始,函数名为search

  2. student_query = []: 创建一个空列表student_query,用于存储查询到的学生信息。

  3. while True:: 进入一个无限循环,直到用户选择退出查询操作。

  4. id = ''name = '': 初始化两个变量idname为空字符串,用于存储用户输入的学号和姓名。

  5. if os.path.exists(filename):: 检查是否存在指定的文件(未提供filename变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  6. mode = input('按学号查找请输入1,按姓名查找请输入2'): 提示用户选择查询方式,1表示按学号查询,2表示按姓名查询。

  7. if mode == '1':: 如果用户选择按学号查询,则要求用户输入要查找学生的学号。

  8. elif mode=='2':: 如果用户选择按姓名查询,则要求用户输入要查找学生的姓名。

  9. else:: 如果用户输入有误(既不是1也不是2),则输出错误提示信息并重新调用search()函数以重新执行查询操作。

  10. with open(filename,'r',encoding='UTF-8') as rfile:: 打开指定的文件进行读取操作,使用with语句可以确保文件在使用后被正确关闭。

  11. student = rfile.readlines(): 读取文件中的所有内容,并将每行内容存储在列表student中。

  12. for item in student:: 遍历student列表中的每一行内容。

  13. d =dict(eval(item)): 将每行内容转换为字典类型,并赋给变量d,这里使用eval()函数将字符串转换为字典类型。

  14. if id != '':if name != '':: 如果用户输入了学号或姓名(即不为空),则执行相应的查询操作。

  15. student_query.append(d): 将符合查询条件的学生信息字典添加到student_query列表中。

  16. show_student(student_query): 调用一个未定义的show_student()函数来显示查询结果,你需要自行定义该函数。

  17. student_query.clear(): 清空student_query列表,以便下一次查询使用。

  18. answer = input('是否继续执行查询操作?y/n\n'): 提示用户是否继续执行查询操作,如果用户输入y则继续,否则执行break语句退出循环。

  19. else:: 如果指定的文件不存在,则输出提示信息"未录入学生信息"并返回,即结束函数的执行。

def search():  # 定义search()函数,查找学生信息
    student_query = []
    while True:
        id = ''
        name = ''
        if os.path.exists(filename):
            # 现在分模式查找,1代表使用id查找,2代表使用name查找
            mode = input('按学号查找请输入1,按姓名查找请输入2')
            if mode == '1':  # 需要加上单引号,因为输入的是字符串,并未转变类型
                id = input('请输入要查找学生的id:')
            elif mode=='2':  # elif就相当于else if的功能,主要在有多个选择时使用,因为if先用来判断是否为1
                # 下面还有两个选择,就是2和其他的数,因此不能直接用else,还要用elif判断一下是否为2
                name = input('请输入要查找学生的姓名:')
            else:
                print('您的输入有误,请重新输入')
                search()  #输入错了,就重新调用函数,也可以使用continue
            with open(filename,'r',encoding='UTF-8') as rfile:  # 读取内容,将所有内容放在student文件中
                student = rfile.readlines()
                for item in student:  # 遍历student列表
                    d =dict(eval(item))  # 字符串转成字典类型
                    if id != '':
                        if d['id'] ==id:
                            student_query.append(d)
                    if name != '':
                        if d['name'] == name:
                            student_query.append(d)
            # 显示查询结果
            show_student(student_query)  # 定义show_student函数
            # 清空列表
            student_query.clear()
            answer = input('是否继续执行查询操作?y/n\n')
            if answer=='y':
                continue
            else:
                break
        else:
            print('未录入学生信息')
            return

05-删除学生信息功能实现            

     3,表示删除学生信息,调用delete()函数,函数如下

        代码解释如下,这段代码定义了一个名为delete()的函数,其作用是用于删除学生信息。:

  1. def delete():: 这是定义一个函数的开始,函数名为delete

  2. while True:: 进入一个无限循环,直到用户选择退出删除操作。

  3. student_id = input('请输入要删除的学生的id:'): 提示用户输入要删除的学生的学号。

  4. if student_id!='':: 检查用户输入的学号是否不为空。

  5. if os.path.exists(filename):: 检查是否存在指定的文件(同样未提供filename变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  6. with open(filename,'r',encoding='UTF-8') as file:: 使用with语句打开文件进行读取操作。

  7. student_old = file.readlines(): 将文件中的所有内容读取到列表student_old中。

  8. flag = False: 初始化一个标记变量flag,用于标记是否删除了学生信息。

  9. if student_old:: 如果student_old列表不为空(即文件中存在学生信息),则执行下面的操作。

  10. with open(filename,'w',encoding='UTF-8') as wfile:: 使用with语句打开文件进行写入操作,这里打开方式为覆盖写入('w’模式)。

  11. for item in student_old:: 遍历student_old列表中的每个学生信息。

  12. d =dict(eval(item)): 将每行内容(学生信息)转换为字典类型,并赋给变量d,这里使用eval()函数将字符串转换为字典类型。

  13. if d['id']!= student_id:: 检查当前学生信息的学号是否与用户输入的学号不相等,如果不相等则写入到新文件中(相当于删除了这条学生信息)。

  14. else:: 如果当前学生信息的学号与用户输入的学号相等,则将标记变量flag设为True,表示找到了要删除的学生信息。

  15. if flag==1:: 如果flagTrue(1),则输出删除成功的提示信息。

  16. else:: 如果flagFalse,则输出未找到要删除的学生信息的提示信息。

  17. show(): 调用一个未定义的show()函数来重新显示全部学生信息,你需要自行定义该函数。

  18. answer = input('是否继续删除学生信息?y/n\n'): 提示用户是否继续执行删除操作,如果用户输入y则继续,否则执行break语句退出循环。

def delete():  # 定义delete()函数,删除学生信息
    while True:
        student_id = input('请输入要删除的学生的id:')
        if student_id!='':
            # 当输入的id之后,则不是空的,此时要判断导入id是否在文件中,使用os模块
            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:  # 这里表示如果列表student_old为真,则执行下面with语句
                with open(filename,'w',encoding='UTF-8') as wfile:  # 使用上下管理器,写入
                    d ={}  # 创建一个空字典
                    for item in student_old:  # 遍历student_old中的信息
                        d=dict(eval(item))   # 将字符串转成字典
                        if d['id']!= student_id:  # 判断是否与输入的信息相等
                            wfile.write(str(d)+'\n')  # 不相等,则写入d字典中
                        else:
                            flag = True  # 相等则执行删除操作
                    if flag==1:
                        print(f'id为{student_id}的学生信息已被删除')
                    else:
                        print(f'没有找到id为{student_id}的学生信息')
            else:  # 文件不存在
                print('无学生信息')
                break
            show()  # 删除之后重新显示全部学生信息
            answer = input('是否继续删除学生信息?y/n\n')
            if answer == 'y':
                continue
            else:
                break

06-修改学生信息功能实现            

     4,表示修改学生信息,调用modify()函数,函数如下

        代码解释如下,这段代码定义了一个名为 modify() 的函数,其作用是用于修改学生信息。

  1. def modify():: 这是定义一个函数的开始,函数名为 modify

  2. show(): 调用一个未定义的 show() 函数来显示全部学生信息,你需要自行定义该函数。

  3. if os.path.exists(filename):: 检查是否存在指定的文件(同样未提供 filename 变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  4. with open(filename,'r',encoding='UTF-8') as rfile:: 使用 with 语句打开文件进行读取操作。

  5. student_old = rfile.readlines(): 将文件中的所有内容读取到列表 student_old 中,每行内容作为列表的一个元素。

  6. student_id = input('请输入需要修改学生的id:'): 提示用户输入需要修改的学生的学号。

  7. if student_id != '':: 检查用户输入的学号是否不为空。

  8. with open(filename,'w',encoding='UTF-8') as wfile:: 使用 with 语句打开文件进行写入操作,这里打开方式为覆盖写入(‘w’ 模式)。

  9. for item in student_old:: 遍历 student_old 列表中的每个学生信息。

  10. d = dict(eval(item)): 将每行内容(学生信息)转换为字典类型,并赋给变量 d,这里使用 eval() 函数将字符串转换为字典类型。

  11. if d['id'] == student_id:: 检查当前学生信息的学号是否与用户输入的学号相等,如果相等则表示找到了要修改的学生信息。

  12. while True:: 进入一个无限循环,直到用户输入正确的信息。

  13. try:: 尝试执行下面的代码块。

  14. d['name'] = input('请输入名字:'): 提示用户输入新的名字,并更新到学生信息中。

  15. d['english'] = input('请输入英语成绩:'): 提示用户输入新的英语成绩,并更新到学生信息中。

  16. d['python'] = input('请输入python成绩:'): 提示用户输入新的Python成绩,并更新到学生信息中。

  17. d['java'] = input('请输入java成绩:'): 提示用户输入新的Java成绩,并更新到学生信息中。

  18. except:: 如果用户输入有误,则执行下面的代码块。

  19. break: 如果用户输入正确,跳出无限循环。

  20. wfile.write(str(d)+'\n'): 将更新后的学生信息写入到文件中。

  21. answer = input('是否继续修改其他学生的信息?y/n\n'): 提示用户是否继续执行修改操作,如果用户输入 y 则继续,否则结束函数。

  22. if answer=='y': modify(): 如果用户选择继续修改其他学生信息,则递归调用 modify() 函数。

def modify():  # 定义modify()函数,修改学生信息
    show()
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            student_old = rfile.readlines()  # readlines() 函数用于读取文件中的所有行,然后将起放入创建的列表中
    else:
        return # 文件不存在,结束函数
    student_id = input('请输入需要修改学生的id:')
    if student_id != '':
        if os.path.exists(filename):
            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['english'] = input('请输入英语成绩:')
                                d['python']  = input('请输入python成绩:')
                                d['java']   = input('请输入java成绩')
                            except:
                                print('输入有误,请重新输入')  # 如果输入有误,则会继续执行while true
                            else:
                                break
                        # 如果都没输入错误,则使用write写入
                        wfile.write(str(d)+'\n')
                        print('修改成功')
                    # 一些学生被修改,还有一些未修改的学生,也就是id不相等的
                    else:
                        wfile.write(str(d)+'\n')
                answer = input('是否继续修改其他学生的信息?y/n\n')
                if answer=='y':
                    modify()  # 在函数里面调用函数

07-对学生成绩进行排序功能实现            

     5,表示对学生成绩进行排序,调用sort()函数,函数如下

        代码解释如下,这段代码定义了一个名为 sort() 的函数,其作用是对学生成绩进行排序。

  1. def sort():: 这是定义一个函数的开始,函数名为 sort

  2. show(): 调用一个未定义的 show() 函数来显示全部学生信息,你需要自行定义该函数。

  3. if os.path.exists(filename):: 检查是否存在指定的文件(同样未提供 filename 变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  4. with open(filename,'r',encoding='UTF-8') as rfile:: 使用 with 语句打开文件进行读取操作。

  5. student_list = rfile.readlines(): 将文件中的所有内容读取到列表 student_list 中,每行内容作为列表的一个元素。

  6. student_new = []: 创建一个空列表 student_new,用于存储将每行学生信息转换为字典后的结果。

  7. for item in student_list:: 遍历 student_list 列表中的每个学生信息。

  8. d = dict(eval(item)): 将每行内容(学生信息)转换为字典类型,并赋给变量 d,这里使用 eval() 函数将字符串转换为字典类型。

  9. student_new.append(d): 将转换后的学生信息字典添加到 student_new 列表中。

  10. asc_or_desc = input('请选择(0.升序 1.降序)'): 提示用户选择排序方式,0 表示升序,1 表示降序。

  11. if asc_or_desc=='0': asc_or_desc_bool = False: 如果用户选择升序,则将 asc_or_desc_bool 设为 False,否则设为 True 表示降序。

  12. mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)'): 提示用户选择排序方式,1 表示按英语成绩排序,2 表示按Python成绩排序,3 表示按Java成绩排序,0 表示按总成绩排序。

  13. 根据用户输入的 mode,使用 lambda 函数定义排序的关键字,然后使用 sort() 函数对 student_new 列表进行排序。

  14. show_student(student_new): 调用一个未定义的 show_student() 函数来显示排序后的学生信息,你需要自行定义该函数。

def sort():    # 定义sort()函数,对学生成绩进行排序
    show()
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            student_list = rfile.readlines()
        student_new = []
        for item in student_list:
            d = dict(eval(item))
            student_new.append(d)
    else:
        return
    # 共有升序和降序两种排序方式,手动输入
    asc_or_desc = input('请选择(0.升序 1.降序)')
    if asc_or_desc=='0':
        asc_or_desc_bool = False
    elif asc_or_desc=='1':
        asc_or_desc_bool = True
    else:
        print('您的输入有误,请重新输入')
        sort()
    mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)')
    if mode=='1':
        student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)
    elif mode =='2':
        student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
    elif mode =='3':
        student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
    elif mode =='0':
        student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)
    else:
        print('您的输入有误,请重新输入')
        sort()
    show_student(student_new)

08-统计学生总人数功能实现            

     6,表示统计学生总人数,调用total()函数,函数如下

        代码解释如下,这段代码定义了一个名为 total() 的函数,其作用是统计学生总人数。

  1. def total():: 这是定义一个函数的开始,函数名为 total

  2. if os.path.exists(filename):: 检查是否存在指定的文件(同样未提供 filename 变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  3. with open(filename,'r',encoding='UTF-8') as rfile:: 使用 with 语句打开文件进行读取操作。

  4. students = rfile.readlines(): 将文件中的所有内容读取到列表 students 中,每行内容作为列表的一个元素。

  5. if students:: 检查 students 列表是否非空,即是否有学生信息。

  6. print(fr'一共有{len(students)}名学生'): 如果有学生信息,则使用 len() 函数统计学生总人数,并打印出来。

  7. else:: 如果 students 列表为空,即没有学生信息,则打印提示信息 '尚未录入学生信息'

def total():   # 定义total()函数,统计学生总人数
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            students = rfile.readlines()
            if students:
                print(fr'一共有{len(students)}名学生')
            else:
                print('尚未录入学生信息')

09-显示所有学生信息功能实现            

     7,表示显示所有学生的信息,调用show()函数,函数如下

        代码解释如下,这段代码定义了一个名为 show() 的函数,其作用是显示所有学生的信息。

  1. def show():: 这是定义一个函数的开始,函数名为 show

  2. student_lst = []: 创建一个空列表 student_lst,用于存储所有学生的信息。

  3. if os.path.exists(filename):: 检查是否存在指定的文件(同样未提供 filename 变量,应该在代码中定义),这里假设用来存储学生信息的文件存在。

  4. with open(filename,'r',encoding='UTF-8') as rfile:: 使用 with 语句打开文件进行读取操作。

  5. students = rfile.readlines(): 将文件中的所有内容读取到列表 students 中,每行内容作为列表的一个元素。

  6. for item in students:: 遍历 students 列表中的每个学生信息。

  7. student_lst.append(eval(item)): 将每行内容(学生信息)转换为字典类型,并添加到 student_lst 列表中。这里使用 eval() 函数将字符串转换为字典类型。

  8. if student_lst:: 检查 student_lst 列表是否非空,即是否有学生信息。

  9. 如果 student_lst 列表非空,则调用一个未定义的 show_student() 函数来显示所有学生的信息,你需要自行定义该函数。

  10. 如果文件不存在或者没有学生信息,则打印提示信息 '尚未录入学生信息!!!'

def show():    # 定义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_student(student_lst)
    else:
        print('尚未录入学生信息!!!')

总结 

01-整体代码实现          

        注:上面仅仅是每一项功能实现的代码,整体代码如下,如果需要使用,一定要使用下面的代码。

import os
filename = 'students.txt'
def main():
    while True:  # 为了显示主菜单
        menu()  # 调用menu()函数
        #  有各种功能,下面就是让用户选择
        choice = int(input('请选择'))
        if choice in [0,1,2,3,4,5,6,7]:  # 共有八个功能,判断选择的是否在这八个序号里面
            if choice==0:  # 选择0,表示退出系统
                answer = input('您确定要退出系统吗?y/n\n')  # 输出一个询问,是否要退出
                if answer=='y' or answer=='Y':  # 判断输入的是否为y
                    print('谢谢您的使用')
                    break  # 打断menu()函数的输出
                else:  # 不是选的y
                    continue  # 继续程序执行
            elif choice==1:  # 如果选择的是1
                insert()  # 调用insert()函数,录入学生信息
            elif choice==2:  # 如果选择的是2
                search()   # 调用search()函数,查找学生信息
            elif choice==3:  # 如果选择的是3
                delete()   # 调用delete()函数,删除学生信息
            elif choice==4:  # 如果选择的是4
                modify()   # 调用modify()函数,修改学生信息
            elif choice==5:  # 如果选择的是5
                sort()     # 调用sort()函数,对学生成绩进行排序
            elif choice==6:  # 如果选择的是6
                total()    # 调用total()函数,统计学生总人数
            elif choice==7:  # 如果选择的是7
                show()     # 调用show()函数,显示所有学生的信息

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 insert():  # 定义insert()函数,录入学生信息
    student_list = []  # 创建一个列表,用于存储录入的学生信息
    while True:  # 循环录入学生信息
        id = input('请输入学号(如1001):')
        if not id:  # 如果没有输入学号或者输入错误,则执行break,退出录入信息操作
            break
        name = input('请输入姓名:')
        if not name:  # 如果是空的,则执行break
            break

        #  然后开始录入成绩信息,但是成绩有可能录入错误,因此用try...except...保证异常处理
        try:
            english = int(input('请输入英语成绩:'))
            python = int(input('请输入python成绩:'))
            java = int(input('请输入Java成绩:'))
        except:  #当你输入的成绩无效时,会执行except语句
            print('输入无效,不是整数类型,请重新输入')
            continue
        # 将录入的学生信息保存到字典
        student = {'id':id,'name':name,'english':english,'python':python,'java':java}
        # 将学生信息添加到列表中
        student_list.append(student)
        anewer = input('是否继续添加?y/n\n')
        if anewer=='y':
            continue
        else:
            break2

    # 信息添加之后,将信息保存到文件中,需要退出循环
    # 调用save()函数,保存信息
    save(student_list)  # save()函数未定义,需要自行定义
    print('学生信息录入完毕!!!')
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 search():  # 定义search()函数,查找学生信息
    student_query = []
    while True:
        id = ''
        name = ''
        if os.path.exists(filename):
            # 现在分模式查找,1代表使用id查找,2代表使用name查找
            mode = input('按学号查找请输入1,按姓名查找请输入2')
            if mode == '1':  # 需要加上单引号,因为输入的是字符串,并未转变类型
                id = input('请输入要查找学生的id:')
            elif mode=='2':  # elif就相当于else if的功能,主要在有多个选择时使用,因为if先用来判断是否为1
                # 下面还有两个选择,就是2和其他的数,因此不能直接用else,还要用elif判断一下是否为2
                name = input('请输入要查找学生的姓名:')
            else:
                print('您的输入有误,请重新输入')
                search()  #输入错了,就重新调用函数,也可以使用continue
            with open(filename,'r',encoding='UTF-8') as rfile:  # 读取内容,将所有内容放在student文件中
                student = rfile.readlines()
                for item in student:  # 遍历student列表
                    d =dict(eval(item))  # 字符串转成字典类型
                    if id != '':
                        if d['id'] ==id:
                            student_query.append(d)
                    if name != '':
                        if d['name'] == name:
                            student_query.append(d)
            # 显示查询结果
            show_student(student_query)  # 定义show_student函数
            # 清空列表
            student_query.clear()
            answer = input('是否继续执行查询操作?y/n\n')
            if answer=='y':
                continue
            else:
                break
        else:
            print('未录入学生信息')
            return
def show_student(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('english'),
                                 item.get('python'),
                                 item.get('java'),
                                 int(item.get('english'))+int(item.get('python'))+int(item.get('java'))
                                 ))
def delete():  # 定义delete()函数,删除学生信息
    while True:
        student_id = input('请输入要删除的学生的id:')
        if student_id!='':
            # 当输入的id之后,则不是空的,此时要判断导入id是否在文件中,使用os模块
            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:  # 这里表示如果列表student_old为真,则执行下面with语句
                with open(filename,'w',encoding='UTF-8') as wfile:  # 使用上下管理器,写入
                    d ={}  # 创建一个空字典
                    for item in student_old:  # 遍历student_old中的信息
                        d=dict(eval(item))   # 将字符串转成字典
                        if d['id']!= student_id:  # 判断是否与输入的信息相等
                            wfile.write(str(d)+'\n')  # 不相等,则写入d字典中
                        else:
                            flag = True  # 相等则执行删除操作
                    if flag==1:
                        print(f'id为{student_id}的学生信息已被删除')
                    else:
                        print(f'没有找到id为{student_id}的学生信息')
            else:  # 文件不存在
                print('无学生信息')
                break
            show()  # 删除之后重新显示全部学生信息
            answer = input('是否继续删除学生信息?y/n\n')
            if answer == 'y':
                continue
            else:
                break
def modify():  # 定义modify()函数,修改学生信息
    show()
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            student_old = rfile.readlines()  # readlines() 函数用于读取文件中的所有行,然后将起放入创建的列表中
    else:
        return # 文件不存在,结束函数
    student_id = input('请输入需要修改学生的id:')
    if student_id != '':
        if os.path.exists(filename):
            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['english'] = input('请输入英语成绩:')
                                d['python']  = input('请输入python成绩:')
                                d['java']   = input('请输入java成绩')
                            except:
                                print('输入有误,请重新输入')  # 如果输入有误,则会继续执行while true
                            else:
                                break
                        # 如果都没输入错误,则使用write写入
                        wfile.write(str(d)+'\n')
                        print('修改成功')
                    # 一些学生被修改,还有一些未修改的学生,也就是id不相等的
                    else:
                        wfile.write(str(d)+'\n')
                answer = input('是否继续修改其他学生的信息?y/n\n')
                if answer=='y':
                    modify()  # 在函数里面调用函数


def sort():    # 定义sort()函数,对学生成绩进行排序
    show()
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            student_list = rfile.readlines()
        student_new = []
        for item in student_list:
            d = dict(eval(item))
            student_new.append(d)
    else:
        return
    # 共有升序和降序两种排序方式,手动输入
    asc_or_desc = input('请选择(0.升序 1.降序)')
    if asc_or_desc=='0':
        asc_or_desc_bool = False
    elif asc_or_desc=='1':
        asc_or_desc_bool = True
    else:
        print('您的输入有误,请重新输入')
        sort()
    mode = input('请选择排序方式(1.英语成绩排序 2.python成绩排序 3.java成绩排序 0.总成绩排序)')
    if mode=='1':
        student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)
    elif mode =='2':
        student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
    elif mode =='3':
        student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
    elif mode =='0':
        student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)
    else:
        print('您的输入有误,请重新输入')
        sort()
    show_student(student_new)
def total():   # 定义total()函数,统计学生总人数
    if os.path.exists(filename):
        with open(filename,'r',encoding='UTF-8') as rfile:
            students = rfile.readlines()
            if students:
                print(fr'一共有{len(students)}名学生')
            else:
                print('尚未录入学生信息')
def show():    # 定义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_student(student_lst)
    else:
        print('尚未录入学生信息!!!')
if __name__ == '__main__':
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/655629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

世界改变了我?还是我在改变着这个世界?-教育的魅力

目录 一、背景二、过程1.拥抱不确定性的心态2.应对变数的积极3.螺旋向上的能力4.突破自我的意志 三、总结 一、背景 现在这个时代唯一确定的就是不确定,社会发展太快了,尤其是中国的发展速度;大国生态人口生态。 有时候隐约中我自己也觉得和…

Linux源码编译安装MySQL + Qt连接MySQL

一、准备工作 1. 编译环境: 银河麒麟V10 飞腾D2000 CPU 2. 下载MySQL源码 这里编译的是5.7.44版本,带Boost库,这是官网的下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 3. 解压压缩包 tar -zxvf mys…

springcloud-服务拆分与远程调用

一 微服务 1.1简单了解 SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud。 SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验&#xff1a…

ChatGPT自然科学应用,R语言lavaan结构方程模型、copula函数

R语言lavaan结构方程模型(SEM) 结构方程模型(Sructural Equation Modeling,SEM)是分析系统内变量间的相互关系的利器,可通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和…

大模型部署_书生浦语大模型 _作业2

本节课可以让同学们实践 4 个主要内容,分别是: 1、部署 InternLM2-Chat-1.8B 模型进行智能对话 1.1安装依赖库: pip install huggingface-hub0.17.3 pip install transformers4.34 pip install psutil5.9.8 pip install accelerate0.24.1…

微软为团队推出了 Copilot

微软希望使其生成式人工智能品牌对团队更有用,特别是跨公司和大型企业组织的团队。 在年度 Build 开发者大会上,微软宣布推出 Team Copilot,这是其 Copilot 系列生成式 AI 技术的最新扩展。 与微软之前的 Copilot 品牌产品不同,…

炸裂!AI五分钟模仿爆款IP故事,涨粉速度太绝了!

‍ ‍大家好,我是向阳。 今天我要分享一个利用AI技术模仿爆款账号的小技巧,帮助大家迅速增加粉丝。这个方法简单实用,尤其适用于副业和本地生活领域。接下来,我将为大家详细讲解操作步骤。让我们开始吧。 副业赚钱:模…

本地开发正常 线上CI/CD构建项目过程报错文件未能正确引用

问题快照 原因分析: 一般遇到这样的错误就是 文件路径或者文件名称未能正确匹配 或者文件不存在 会报这样的错误 以为很好解决 但这次 都排查 了 就是 没发现原因 不管怎么说还是要感谢 GPT的能力(分析问题的能力) 先上图 当我看到 第四步的时候 我立马 去仓库里查…

Go Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8二、邮箱服务配置,以QQ邮箱为例 三、示例代码 package mainimport ("context""fmt"redis "github.com/go-redis/redis/v8""gopkg.in/gomail.v2""gopkg.in/ini.v1"&quo…

怎样查看JavaScript中没有输出结果的数组值?

在JavaScript中,可以方便地定义和使用数组,对于已经定义的数组,怎样查看其值呢? 看下面的示例,并运行它。 上面的示例中,标签不完整,请补充完整再试运行。你知道少了什么标签么? 注…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线,回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息,但是ETH上下插针,杵在3.8k,微微下跌。定睛仔细一看,SEC批准了,但又没完全批准,这特么是薛定谔的批准哈&…

本地部署 MiniCPM-Llama3-V 2.5

本地部署 MiniCPM-Llama3-V 2.5 0. 引言1. 性能评估2. 典型示例3. 本地部署4. 运行 WebUI Demo5. vLLM 部署 0. 引言 MiniCPM-Llama3-V 2.5 是 MiniCPM-V 系列的最新版本模型,基于 SigLip-400M 和 Llama3-8B-Instruct 构建,共 8B 参数量,相较…

AWS迁移与传输之AMS/MGN

AWS Application Migration Service(AWS Application Migration Service简称为AWS MGN,MGN是migration的缩写。)是一项全面的迁移服务,旨在帮助企业将其本地服务器和虚拟机迁移到云端,包括AWS和VMware Cloud on AWS。 …

【pyspark速成专家】11_Spark性能调优方法2

目录 ​编辑 二,Spark任务UI监控 三,Spark调优案例 二,Spark任务UI监控 Spark任务启动后,可以在浏览器中输入 http://localhost:4040/ 进入到spark web UI 监控界面。 该界面中可以从多个维度以直观的方式非常细粒度地查看Spa…

防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)

防止浏览器缓存了静态的配置文件 前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头:前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时候防止的静态配置文件c…

Linux线程:管理与控制

一、引言 随着计算机硬件技术的飞速发展&#xff0c;尤其是多核CPU的普及&#xff0c;多线程编程已成为充分利用系统资源、提高程序并发性和响应速度的关键技术。 多线程编程允许一个程序中同时运行多个线程&#xff0c;每个线程可以独立地执行不同的任务。这种并行处理的方式…

计算机操作系统体系结构

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天给大家讲讲操作系统。 当今的操作系统趋向于越来越复杂&#xff0c;因为它们提供许多服务&#xff0c;并支持各种硬件和软件资源&#xff08;请参见“操作系统思想&#xff1a;尽量保持简单”&#xff0…

Dynadot API调整一览

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

DISCO: Disentangled Control for Realistic Human Dance Generation

NTU&Microsoft CVPR24https://github.com/Wangt-CN/DisCo 问题引入 提高human motion transfer模型的泛化性&#xff1b;给出 f , g f,g f,g作为参考图片的前背景&#xff0c;然后给出单个pose p p t pp_t ppt​或者pose序列 p { p 1 , p 2 , ⋯ , p T } p \{p_1,p_2…

撤销最近一次的提交,使用git revert 和 git reset的区别

文章目录 工作区 暂存区 本地仓库 远程仓库需求&#xff1a;已推送到远程仓库&#xff0c;想要撤销操作git revert &#xff08;添加新的提交来“反做”之前的更改&#xff0c;云端会残留上次的提交记录&#xff09;git reset&#xff08;相当于覆盖上次的提交&#xff09;1.--…