Python打卡第十八天,跟着CSDN练习语法

# 控制台学生信息管理系统

目录

项目结构 

 代码思路

 实现界面展示

 功能菜单

 主函数

 1录入学生成绩信息

 将学生信息保存到文件中

 按行储存

2查找学生成绩信息 

 将保存在列表中的学生信息显示出来

简单介绍函数功能 

 3删除学生成绩信息

 4修改学生成绩信息

 5排序

 6统计学生总数

 7显示所有学生信息

 全部代码

 结果 

总结错误

错误示范

正确示范 

案例源代码



项目结构 

Python打卡第十八天,跟着CSDN练习语法_第1张图片

 代码思路

        还是原来的老套路,只不过这回程序步骤比较多,我边写边说。

因为这个案例要用到 正则表达式 和 操作系统 模块,所以我就先导入这两个模块了;

import re  # 导入正则表达式模块
import os  # 导入操作系统模块

首先,我先展示一下我想要实现的 控制学生信息操作系统 的实现界面: 

 实现界面展示 

Python打卡第十八天,跟着CSDN练习语法_第2张图片

如图,我们可以看出,最先展示的是功能菜单, 然后是 请选择 的手动输入,最后是展示功能。代码是从上而下执行的,所以,我必须先定义一个功能菜单的函数,然后再对菜单实现功能操作。

 功能菜单

# 定义功能菜单
def menu():
    # 显示菜单
    print('''
    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    ''')

 主函数

接下来,我们就要通过定义一个主菜单来实现具体的功能了; 

# 定义主函数
def main():
    ctrl = True  # 标记是否退出系统(哨兵变量)
    while ctrl:
        # 显示菜单
        menu()
        option = input("请选择您想要进行的操作:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ["0", "1", "2", "3", "4", "5", "6", "7"]:
            option_int = int(option_str)
            if option_int == 0:  # 退出程序
                print("您已成功退出学生信息管理系统!")
                ctrl = False  # 哨兵变量
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()

注:这里有一个 需要注意的地方,第5行的代码,我来简单介绍一下 re.sub() 的用法;

\D 表示的是非数字 re.sub("\D", "", option)  表示在option这个字符串里,把不是数字的都表示为“”;接下来,我们就根据这个主菜单来设计这个程序吧。

 1录入学生成绩信息

首先,是 录入学生成绩信息 ,所以定义一个 insert() 函数;写一个这样环环相套的程序,所以就要保证程序的严密性,刚开始写的时候,大家都没有这么严密的思维能力,第一次写一个 比较长的案例,我连有些代码的作用都不知道,所以,写这个案例的第一次,先搞清楚每一行代码的意思以及它的思路,然后用整体与部分的眼光来看这个案例,所有的问题就迎刃而解了。

# 1录入学生成绩
def insert():
    studentList = []  # 保存学生信息的列表
    mark = True  # 是否继续添加(哨兵变量,用起来很方便)
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入姓名:")
        if not name:  # 名字为空,跳出循环
            break

        # 输入出现错误的应对措施
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值!!!请重新录入信息!")
            continue

        # 将输入的学生信息保存到字典
        student = {"id": id, "name": name, "english": english, "python": python, "c": c}
        # 将学生字典添加到列表中
        studentList.append(student)

        # 是否继续添加
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":
            mark = True  # 继续添加
        else:
            mark = False  # 停止添加
    # 将学生信息保存到文件,调用save()函数
    save(studentList)
    print("学生信息录入完毕!!!")

在insert()录入学生的成绩信息,我们 录入信息 ,就要考虑到 保存信息 ,所以要定义一个保存学生信息的函数  save() 

 将学生信息保存到文件中

# 将学生信息保存到文件中
def save(student):
    try:
        # 以追加模式打开文件
        student_txt = open(filename, "a")
    except:
        # 文件不存在,创建文件并打开
        student_txt = open(filename, "w")
    for info in student:
        # 按行存储,添加换行符
        student_txt.write(str(info) + "\n")
    # 关闭文件
    student_txt.close()

 按行储存

按行存储示例如下: 

Python打卡第十八天,跟着CSDN练习语法_第3张图片 

2查找学生成绩信息 

 接下来,实现 查找学生成绩信息 的功能;

# 2查找学生成绩信息
def search():
    mark = True
    student_query = []  # 保存查询结果的学生列表
    while mark:
        id = ""
        name = ""
        # 判断文件是否存在
        if os.path.exists(filename):
            mode = input("按ID查输入1,按姓名查输入2:")
            if mode == "1":
                id = input("请输入学生ID:")
            elif mode == "2":
                name = input("请输入学生姓名:")
            else:
                print("您输入有误,请重新输入!")
                search()  # 重新查询
            # 打开文件
            with open(filename, "r") as file:
                # 读取全部内容
                student = file.readlines()
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id != "":  # 判断是否按照ID查
                        if d["id"] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name != "":  # 判断是否按照姓名查
                        if d["name"] == name:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                show_student(student_query)  # 显示查询结果
                student_query.clear()  # 清空列表

                # 是否继续查询
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息······")
            return

 将保存在列表中的学生信息显示出来

查询到数据,需要显示出来,所以需要定义一个显示查询信息的函数 show_student()  

# 将保存在列表中的学生信息显示出来
def show_student(studentList):
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:
        print(format_data.format(info.get("id"), info.get("name"), str(info.get("english")), str(info.get("python")),
                                 str(info.get("c")),
                                 str(info.get("english") + info.get("python") + info.get("c")).center(12)))

简单介绍函数功能 

简单的介绍一下 第6行代码 {:^6}的作用 以及 get() 函数, center() 函数;

 3删除学生成绩信息

3和1,2大同小异,3中调用了 show() 函数,后续会写到的

# 3删除学生成绩信息
def delete():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId != "":  # 判断要删除的学生是否存在
            if os.path.exists(filename):  # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines()  # 读取全部内容
            else:
                student_old = []
            ifdel = False  # 标记是否删除
            if student_old:  # 如果存在学生信息
                with open(filename, 'w') as wfile:  # 以写方式打开文件
                    d = {}  # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))  # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  # 将一条学生信息写入文件
                        else:
                            ifdel = True  # 标记已经删除
                    if ifdel:
                        print("ID为 %s 的学生信息已经被删除..." % studentId)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
                break  # 退出循环
            show()  # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能

 4修改学生成绩信息

4和1,2,3都是大同小异,仍旧是用到了 show() 函数,后续会写到;

# 4修改学生成绩信息
def modify():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        return
    studentid = input("请输入要修改的学生ID:")
    with open(filename, "w") as wfile:  # 以写模式打开文件
        for student in student_old:
            d = dict(eval(student))  # 字符串转字典
            if d["id"] == studentid:  # 是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:  # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break  # 跳出循环
                student = str(d)  # 将字典转换为字符串
                wfile.write(student + "\n")   # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)  # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息?(y/n):")
    if mark == "y":
        modify()  # 重新执行修改操作

 5排序

5和前几个比较像,稍微不同的是有排序,倒序Ture,正序False 

# 5排序
def sort():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as file:  # 打开文件
            student_old = file.readlines()  # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))  # 字符串转字典
            student_new.append(d)  # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":  # 按升序排序
        ascORdescBool = False           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为True表示降序排序
    else:
        print("您的输入有误,请重新输入!")
        sort()
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":  # 按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse = ascORdescBool)
    elif mode == "2":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse = ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        student_new.sort(key=lambda x: x["c"], reverse = ascORdescBool)
    elif mode == "0":  # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse = ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)  # 显示排序结果

 6统计学生总数

# 6统计学生总数
def total():
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print(f"一共有{len(student_old)}名学生!")
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")

 7显示所有学生信息

 他来了 ,他终于来啦!show()函数终于来啦!

# 7显示所有学生成绩信息
def show():
    student_new = []
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")

 全部代码

# 控制台学生信息管理系统

import re  # 导入正则表达式模块
import os  # 导入操作系统模块

filename = "students.txt"  # 定义保存学生信息的文件名


# 定义功能菜单
def menu():
    # 显示菜单
    print('''
    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    ''')


# 定义主函数
def main():
    ctrl = True  # 标记是否退出系统(哨兵变量)
    while ctrl:
        # 显示菜单
        menu()
        option = input("请选择您想要进行的操作:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ["0", "1", "2", "3", "4", "5", "6", "7"]:
            option_int = int(option_str)
            if option_int == 0:  # 退出程序
                print("您已成功退出学生信息管理系统!")
                ctrl = False  # 哨兵变量
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


# 1录入学生成绩
def insert():
    studentList = []  # 保存学生信息的列表
    mark = True  # 是否继续添加(哨兵变量,用起来很方便)
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入姓名:")
        if not name:  # 名字为空,跳出循环
            break

        # 输入出现错误的应对措施
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值!!!请重新录入信息!")
            continue

        # 将输入的学生信息保存到字典
        student = {"id": id, "name": name, "english": english, "python": python, "c": c}
        # 将学生字典添加到列表中
        studentList.append(student)

        # 是否继续添加
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":
            mark = True  # 继续添加
        else:
            mark = False  # 停止添加
    # 将学生信息保存到文件,调用save()函数
    save(studentList)
    print("学生信息录入完毕!!!")


# 将学生信息保存到文件中
def save(student):
    try:
        # 以追加模式打开文件
        student_txt = open(filename, "a")
    except:
        # 文件不存在,创建文件并打开
        student_txt = open(filename, "w")
    for info in student:
        # 按行存储,添加换行符
        student_txt.write(str(info) + "\n")
    # 关闭文件
    student_txt.close()


# 2查找学生成绩信息
def search():
    mark = True
    student_query = []  # 保存查询结果的学生列表
    while mark:
        id = ""
        name = ""
        # 判断文件是否存在
        if os.path.exists(filename):
            mode = input("按ID查输入1,按姓名查输入2:")
            if mode == "1":
                id = input("请输入学生ID:")
            elif mode == "2":
                name = input("请输入学生姓名:")
            else:
                print("您输入有误,请重新输入!")
                search()  # 重新查询
            # 打开文件
            with open(filename, "r") as file:
                # 读取全部内容
                student = file.readlines()
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id != "":  # 判断是否按照ID查
                        if d["id"] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name != "":  # 判断是否按照姓名查
                        if d["name"] == name:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                show_student(student_query)  # 显示查询结果
                student_query.clear()  # 清空列表

                # 是否继续查询
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息······")
            return


# 将保存在列表中的学生信息显示出来
def show_student(studentList):
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:
        print(format_data.format(info.get("id"), info.get("name"),
                                 str(info.get("english")), str(info.get("python")), str(info.get("c")),
                                 str(info.get("english") + info.get("python") + info.get("c")).center(12)))


# 3删除学生成绩信息
def delete():
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId != "":  # 判断要删除的学生是否存在
            if os.path.exists(filename):  # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines()  # 读取全部内容
            else:
                student_old = []
            ifdel = False  # 标记是否删除
            if student_old:  # 如果存在学生信息
                with open(filename, 'w') as wfile:  # 以写方式打开文件
                    d = {}  # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))  # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  # 将一条学生信息写入文件
                        else:
                            ifdel = True  # 标记已经删除
                    if ifdel:
                        print("ID为 %s 的学生信息已经被删除..." % studentId)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
                break  # 退出循环
            show()  # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能


# 4修改学生成绩信息
def modify():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        return
    studentid = input("请输入要修改的学生ID:")
    with open(filename, "w") as wfile:  # 以写模式打开文件
        for student in student_old:
            d = dict(eval(student))  # 字符串转字典
            if d["id"] == studentid:  # 是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:  # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break  # 跳出循环
                student = str(d)  # 将字典转换为字符串
                wfile.write(student + "\n")  # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)  # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息?(y/n):")
    if mark == "y":
        modify()  # 重新执行修改操作


# 5排序
def sort():
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as file:  # 打开文件
            student_old = file.readlines()  # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))  # 字符串转字典
            student_new.append(d)  # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":  # 按升序排序
        ascORdescBool = False  # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True  # 标记变量,为True表示降序排序
    else:
        print("您的输入有误,请重新输入!")
        sort()
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":  # 按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
    elif mode == "2":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
    elif mode == "0":  # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)  # 显示排序结果


# 6统计学生总数
def total():
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print(f"一共有{len(student_old)}名学生!")
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")


# 7显示所有学生成绩信息
def show():
    student_new = []
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")


if __name__ == "__main__":
    main()

 结果 


    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    
请选择您想要进行的操作:1'
请输入ID(如 1001):1007
请输入姓名:张艺兴
请输入英语成绩:99
请输入python成绩:98
请输入C语言成绩:100
是否继续添加?(y/n):n
学生信息录入完毕!!!

    ╔————————————————————学生信息管理系统—————————————————╗
    │                                                  │
    │   =============== 功能菜单 ===============         │
    │                                                  │
    │   1 录入学生信息                                   │
    │   2 查找学生信息                                   │
    │   3 删除学生信息                                   │
    │   4 修改学生信息                                   │
    │   5 排序                                          │
    │   6 统计学生总人数                                  │
    │   7 显示所有学生信息                                 │
    │   0 退出系统                                       │
    │  ==========================================      │
    │  说明:通过数字或↑↓方向键选择菜单                      │
    ╚——————————————————————————————————————————————————╝
    
请选择您想要进行的操作:
{'id': '1007', 'name': 'zyx', 'english': 99, 'python': 99, 'c': 111}
{'id': '1007', 'name': '张艺兴', 'english': 99, 'python': 98, 'c': 100}

总结错误

最后,发现了一个致命的错误,我就不标注了,聪明人一定一眼就看出问题所在了。

错误示范

Python打卡第十八天,跟着CSDN练习语法_第4张图片

正确示范 

Python打卡第十八天,跟着CSDN练习语法_第5张图片

案例源代码

# 开发工具:PyCharm
import re  # 导入正则表达式模块
import os  # 导入操作系统模块

filename = "students.txt"  # 定义保存学生信息的文件名


def menu():
    # 输出菜单
    print('''
    ╔———————学生信息管理系统————————╗
    │                                             │
    │   =============== 功能菜单 ===============   │
    │                                              │
    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                     │
    │   6 统计学生总人数                           │
    │   7 显示所有学生信息                         │
    │   0 退出系统                                 │
    │  ==========================================  │
    │  说明:通过数字或↑↓方向键选择菜单          │
    ╚———————————————————————╝
    ''')


def main():
    ctrl = True  # 标记是否退出系统
    while (ctrl):
        menu()  # 显示菜单
        option = input("请选择:")  # 选择菜单项
        option_str = re.sub("\D", "", option)  # 提取数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:  # 退出系统
                print('您已退出学生成绩管理系统!')
                ctrl = False
            elif option_int == 1:  # 录入学生成绩信息
                insert()
            elif option_int == 2:  # 查找学生成绩信息
                search()
            elif option_int == 3:  # 删除学生成绩信息
                delete()
            elif option_int == 4:  # 修改学生成绩信息
                modify()
            elif option_int == 5:  # 排序
                sort()
            elif option_int == 6:  # 统计学生总数
                total()
            elif option_int == 7:  # 显示所有学生信息
                show()


def insert():
    """1 录入学生信息"""
    stdentList = []        # 保存学生信息的列表
    mark = True  # 是否继续添加
    while mark:
        id = input("请输入ID(如 1001):")
        if not id:  # ID为空,跳出循环
            break
        name = input("请输入名字:")
        if not name:  # 名字为空,跳出循环
            break
        try:
            english = int(input("请输入英语成绩:"))
            python = int(input("请输入Python成绩:"))
            c = int(input("请输入C语言成绩:"))
        except:
            print("输入无效,不是整型数值....重新录入信息")
            continue
        stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}  # 将输入的学生信息保存到字典
        stdentList.append(stdent)  # 将学生字典添加到列表中
        inputMark = input("是否继续添加?(y/n):")
        if inputMark == "y":  # 继续添加
            mark = True
        else:  # 不继续添加
            mark = False
    save(stdentList)  # 将学生信息保存到文件
    print("学生信息录入完毕!!!")


# 将学生信息保存到文件
def save(student):
    try:
        students_txt = open(filename, "a")  # 以追加模式打开
    except Exception as e:
        students_txt = open(filename, "w")  # 文件不存在,创建文件并打开
    for info in student:
        students_txt.write(str(info) + "\n")  # 按行存储,添加换行符
    students_txt.close()  # 关闭文件


def search():
    """2 查找学生成绩信息"""
    mark = True
    student_query = []  # 保存查询结果的学生列表
    while mark:
        id = ""
        name = ""
        if os.path.exists(filename):  # 判断文件是否存在
            mode = input("按ID查输入1;按姓名查输入2:")
            if mode == "1":
                id = input("请输入学生ID:")
            elif mode == "2":
                name = input("请输入学生姓名:")
            else:
                print("您的输入有误,请重新输入!")
                search()  # 重新查询
            with open(filename, 'r') as file:  # 打开文件
                student = file.readlines()  # 读取全部内容
                for list in student:
                    d = dict(eval(list))  # 字符串转字典
                    if id is not "":  # 判断是否按ID查
                        if d['id'] == id:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                    elif name is not "":  # 判断是否按姓名查
                        if d['name'] == name:
                            student_query.append(d)  # 将找到的学生信息保存到列表中
                show_student(student_query)  # 显示查询结果
                student_query.clear()  # 清空列表
                inputMark = input("是否继续查询?(y/n):")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息...")
            return


def delete():
    """3 删除学生成绩信息"""
    mark = True  # 标记是否循环
    while mark:
        studentId = input("请输入要删除的学生ID:")
        if studentId is not "":  # 判断要删除的学生是否存在
            if os.path.exists(filename):  # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines()  # 读取全部内容
            else:
                student_old = []
            ifdel = False  # 标记是否删除
            if student_old:  # 如果存在学生信息
                with open(filename, 'w') as wfile:  # 以写方式打开文件
                    d = {}  # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))  # 字符串转字典
                        if d['id'] != studentId:
                            wfile.write(str(d) + "\n")  # 将一条学生信息写入文件
                        else:
                            ifdel = True  # 标记已经删除
                    if ifdel:
                        print("ID为 %s 的学生信息已经被删除..." % studentId)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentId)
            else:  # 不存在学生信息
                print("无学生信息...")
                break  # 退出循环
            show()  # 显示全部学生信息
            inputMark = input("是否继续删除?(y/n):")
            if inputMark == "y":
                mark = True  # 继续删除
            else:
                mark = False  # 退出删除学生信息功能


def modify():
    """4 修改学生成绩信息"""
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
    else:
        return
    studentid = input("请输入要修改的学生ID:")
    with open(filename, "w") as wfile:  # 以写模式打开文件
        for student in student_old:
            d = dict(eval(student))  # 字符串转字典
            if d["id"] == studentid:  # 是否为要修改的学生
                print("找到了这名学生,可以修改他的信息!")
                while True:  # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名:")
                        d["english"] = int(input("请输入英语成绩:"))
                        d["python"] = int(input("请输入Python成绩:"))
                        d["c"] = int(input("请输入C语言成绩:"))
                    except:
                        print("您的输入有误,请重新输入。")
                    else:
                        break  # 跳出循环
                student = str(d)  # 将字典转换为字符串
                wfile.write(student + "\n")   # 将修改的信息写入到文件
                print("修改成功!")
            else:
                wfile.write(student)  # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息?(y/n):")
    if mark == "y":
        modify()  # 重新执行修改操作


def sort():
    """5 排序"""
    show()  # 显示全部学生信息
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as file:  # 打开文件
            student_old = file.readlines()  # 读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))  # 字符串转字典
            student_new.append(d)  # 将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择(0升序;1降序):")
    if ascORdesc == "0":  # 按升序排序
        ascORdescBool = False           # 标记变量,为False表示升序排序
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = True          # 标记变量,为True表示降序排序
    else:
        print("您的输入有误,请重新输入!")
        sort()
    mode = input("请选择排序方式(1按英语成绩排序;2按Python成绩排序;3按C语言成绩排序;0按总成绩排序):")
    if mode == "1":  # 按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
    elif mode == "2":  # 按Python成绩排序
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":  # 按C语言成绩排序
        student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
    elif mode == "0":  # 按总成绩排序
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
    else:
        print("您的输入有误,请重新输入!")
        sort()
    show_student(student_new)  # 显示排序结果


def total():
    """6 统计学生总数"""
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
            if student_old:
                print("一共有 %d 名学生!" % len(student_old))
            else:
                print("还没有录入学生信息!")
    else:
        print("暂未保存数据信息...")


def show():
    """7 显示所有学生信息"""
    student_new = []
    if os.path.exists(filename):  # 判断文件是否存在
        with open(filename, 'r') as rfile:  # 打开文件
            student_old = rfile.readlines()  # 读取全部内容
        for list in student_old:
            student_new.append(eval(list))  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")


def show_student(studentList):
    """将保存在列表中的学生信息显示出来"""
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:
        print(format_data.format(info.get("id"), info.get("name"), str(info.get("english")), str(info.get("python")),
                                 str(info.get("c")),
                                 str(info.get("english") + info.get("python") + info.get("c")).center(12)))


if __name__ == "__main__":
    main()

你可能感兴趣的:(Python基础练习,python,开发语言)