练习09:学生管理系统

方法 说明
re.sub("\D", “”, option) 将option中的非数字的字符去掉,提取出数字
os.path.exits(filename) 判断filename文件是否存在的意思,括号内的可以是文件路径。
list.clear() 清空列表

版本一

# _*_coding:utf-8_*_
# @Time     :2019/12/2919:52
# @Authoe   :zjy
# @Filename :12-28.py
# @Sofeware :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()

# 1 录入学生信息
def insert():
    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()  # 关闭文件

'''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 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 show_student(studentList):
    from prettytable import PrettyTable
    if not studentList:
        print("(o@.@o) 无数据信息 (o@.@o) \n")
        return
    field_names = ("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩")
    table = PrettyTable(field_names=field_names)
    for info in studentList:
        sum_score = info.get('english', 0) + info.get('python', 0) + info.get('c', 0)
        row = list(info.values())
        row.append(sum_score)
        table.add_row(row)
    print(table)



'''3 删除学生成绩信息'''
def delete():
    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  # 退出删除学生信息功能

'''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("一共有 %d 名学生!" % 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:
            #print(eval(list))
            # print(list)
            list = eval(list)  # 字符串转字典
            student_new.append(list)  # 将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息...")

main()

版本二

# _*_coding:utf-8_*_
# @Time     :2020/1/811:37
# @Authoe   :zjy
# @Filename :学生管理系统2.py
# @Sofeware :PyCharm

from prettytable import PrettyTable
import os
import time


def menus():
    print("""
                    学生信息管理系统
        =============== 功能菜单 ===============        
    │   1 录入学生信息                             │
    │   2 查找学生信息                             │
    │   3 删除学生信息                             │
    │   4 修改学生信息                             │
    │   5 排序                                     │
    │   6 显示所有学生信息                          │
    │   0 退出系统                                 
    """)


student_txt = 'students.txt'


def add_info():
    # 1.录入学生信息
    mark1 = True
    while mark1:
        with open(student_txt, 'a+') as f:
            id = input('学号(如:1001):')
            if not id:
                continue
            name = input('姓名:')
            if not id:
                continue
            f.seek(0, 0)
            list = [eval(i.strip()) for i in f.readlines()]
            for i in list:
                if i['id'] == id:
                    print('此学生学号信息已经存在')
                    break
                elif i['name'] == name:
                    print('此学生姓名已经存在')
                    break
                else:
                    pass
            else:
                try:
                    english = float(input('英语成绩:'))
                    match = float(input('数学成金:'))
                    chinese = float(input('语文成绩:'))
                except Exception as r:
                    print('输入成绩无效')
                    continue
                info = {'id': id,
                        'name': name,
                        'english': english,
                        'match': match,
                        'chinese': chinese
                        }
                f.write(str(info) + '\n')
        word = int(input('是否还要继续录入学生信息(1:继续,0:退出):'))
        if word == 1:
            pass
        elif word == 0:
            mark1 = False
        else:
            print('您的输入错误')
            break
    return


def find_info():
    # 2.查找学生信息
    mark2 = True
    while mark2:
        try:
            with open(student_txt, 'r') as f:
                id_name = input('学号或姓名(如:1001 or zz):')
                if not id_name:
                    continue
                list = [eval(i.strip()) for i in f.readlines()]
                for i in list:
                    if i['id'] == id_name or i['name'] == id_name:
                        show = i.values()
                        field_names = ("ID", '名字', '英语成绩', 'Python成绩', 'C语言成绩')
                        table = PrettyTable(field_names=field_names)
                        table.add_row(show)
                        print(table)
                        break
                else:
                    print('没有这个学生信息')
            word = int(input('是否还要继续查询学生信息(1:继续,0:退出):'))
            if word == 1:
                pass
            elif word == 0:
                mark2 = False
            else:
                print('您的输入错误')
                break
        except:
            print('没有学生管理文件')
            break


def delete_info():
    # 3.删除学生信息
    mark3 = True
    while mark3:
        if os.path.exists(student_txt):
            with open(student_txt, 'r') as f:
                list = [eval(i.strip()) for i in f.readlines()]
            id_name = input('学号或姓名(如:1001 or zz):')
            if not id_name:
                continue
            for i in list:
                if i['id'] == id_name or i['name'] == id_name:
                    show = i.values()
                    field_names = ("ID", '名字', '英语成绩', 'Python成绩', 'C语言成绩')
                    table = PrettyTable(field_names=field_names)
                    table.add_row(show)
                    print(table)
                    list.remove(i)
                    with open(student_txt, 'w') as f:
                        for i in list:
                            f.write(str(i) + '\n')
                    break
            else:
                print('没有这个学生信息')
            word = int(input('是否还要继续删除学生信息(1:继续,0:退出):'))
            if word == 1:
                pass
            elif word == 0:
                mark3 = False
            else:
                print('您的输入错误')
                break
        else:
            print('暂未保存数据')
            break


def alter_info():
    mark4 = True
    while mark4:
        if os.path.exists(student_txt):
            with open(student_txt, 'r') as f:
                list = [eval(i.strip()) for i in f.readlines()]
            id_name = input('学号或姓名(如:1001 or zz):')
            if not id_name:
                continue
            for i in list:
                if i['id'] == id_name or i['name'] == id_name:
                    print("找到了这名学生!")
                    show = i.values()
                    field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩')
                    table = PrettyTable(field_names=field_names)
                    table.add_row(show)
                    print(table)
            # else:
            #     print('没有此学生')

            with open(student_txt, 'w') as f:
                for i in list:
                    if i['id'] == id_name or i['name'] == id_name:
                        while True:
                            try:
                                i['name'] = input("请输入修改的姓名:")
                                i['english'] = int(input("请输入修改的英语成绩:"))
                                i['match'] = int(input("请输入修改的数学成绩:"))
                                i['chinese'] = int(input("请输入修改的语文成绩:"))
                            except:
                                print("您的输入有误,请重新输入。")
                            else:
                                break
                        print('********修改之后的信息********')
                        show1 = i.values()
                        field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩')
                        table = PrettyTable(field_names=field_names)
                        table.add_row(show1)
                        print(table)
                        f.write(str(i) + '\n')
                    else:
                        f.write(str(i) + '\n')

            word = int(input('是否还要继续修改学生信息(1:继续,0:退出):'))
            if word == 1:
                pass
            elif word == 0:
                mark4 = False
            else:
                print('您的输入错误')
                break
        else:
            print('暂未保存数据')
            break


def sort_info():
    mark5 = True
    while mark5:
        sort_name = input('请输入排序的内容(英语/数学/语文/总成绩):')
        with open(student_txt, 'r') as f:
            list1 = [eval(i.strip()) for i in f.readlines()]
            if sort_name == '英语':
                sort_english = sorted(list1, key=lambda list1: list1['english'], reverse=True)
                field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩', '总成绩')
                table = PrettyTable(field_names=field_names)
                for i in sort_english:
                    show = list(i.values())
                    sum_grade = i['english'] + i['match'] + i['chinese']
                    show.append(sum_grade)
                    table.add_row(show)
                print(table)
                sort_alter(sort_english)
            elif sort_name == '数学':
                sort_match = sorted(list1, key=lambda list1: list1['match'], reverse=True)
                field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩', '总成绩')
                table = PrettyTable(field_names=field_names)
                for i in sort_match:
                    show = list(i.values())
                    sum_grade = i['english'] + i['match'] + i['chinese']
                    show.append(sum_grade)
                    table.add_row(show)
                print(table)
                sort_alter(sort_match)
            elif sort_name == '语文':
                sort_chinese = sorted(list1, key=lambda list1: list1['chinese'], reverse=True)
                field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩', '总成绩')
                table = PrettyTable(field_names=field_names)
                for i in sort_chinese:
                    show = list(i.values())
                    sum_grade = i['english'] + i['match'] + i['chinese']
                    show.append(sum_grade)
                    table.add_row(show)
                print(table)
                sort_alter(sort_chinese)
            elif sort_name == '总成绩':
                field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩', '总成绩')
                table = PrettyTable(field_names=field_names)
                for i in list1:
                    sum_grade = i['english'] + i['match'] + i['chinese']
                    i['sum'] = sum_grade
                sort_sum = sorted(list1, key=lambda list1: list1['sum'], reverse=True)
                for n in sort_sum:
                    show = list(n.values())
                    table.add_row(show)
                print(table)
                sort_alter(sort_sum)
            else:
                print('您的输入错误,请重新输入')
                continue
        mark5 = False


def sort_alter(sort_list):
    word = input('是否将排序后写生信息更改原有学生信息(1:是,0:否)?')
    if word == '1':
        with open(student_txt, 'w') as f:
            for i in sort_list:
                f.write(str(i) + '\n')
    elif word == '0':
        pass
    else:
        print('输入错误')
    return


def show_info():
    if os.path.exists(student_txt):
        with open(student_txt, 'r') as f:
            list1 = [eval(i.strip()) for i in f.readlines()]
            field_names = ('学号', '名字', '英语成绩', '数学成绩', '语文成绩', '总成绩')
            table = PrettyTable(field_names=field_names)
            for i in list1:
                show = list(i.values())
                sum_grade = i['english'] + i['match'] + i['chinese']
                show.append(sum_grade)
                table.add_row(show)
            print(table)
            print('学生的总人数为:%d' % len(list1))
    else:
        print('暂无数据')


def main():
    mark = True
    while mark:
        menus()
        choice = int(input('请输入功能选项:'))
        if choice == 0:
            print('您已退出学生成绩管理系统!')
            mark = False
        if choice == 1:
            add_info()
        if choice == 2:
            find_info()
        if choice == 3:
            delete_info()
        if choice == 4:
            alter_info()
        if choice == 5:
            sort_info()
        if choice == 6:
            show_info()
        time.sleep(1)


main()

发布了106 篇原创文章 · 获赞 1 · 访问量 2384

猜你喜欢

转载自blog.csdn.net/weixin_43384009/article/details/103814820