30_python实操案例—学生管理系统

复制代码
import os
filename = 'student.txt'
def main():
    while True:
        menum()
        choice = int(input("请选择对应数字:"))
        if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
            if choice == 0:
                answer = input("您确定要退出系统吗?y/n")
                # 不管输入的是大写还是小写都会退出系统
                if answer == 'y' or answer == 'Y':
                    print('谢谢你的使用!!再见!!!')
                    break  # 退出系统
                else:
                    continue
            elif choice == 1:
                insert()   # 录入学生信息

            elif choice == 2:
                search()   # 查找学生信息

            elif choice == 3:
                delete()  # 删除学生信息

            elif choice == 4:
                modify()  # 修改学生信息

            elif choice == 5:
                sort()  # 学生成绩排序

            elif choice == 6:
                total()  # 统计学生总人数'

            elif choice == 7:
                show()  # 显示所有学生信息

def menum():
    print('===========================学生信息管理系统=====================================')
    print('------------------------------功能菜单-----------------------------------------')
    print('\t\t\t\t\t\t  1.录入学生信息')
    print('\t\t\t\t\t\t  2.查找学生信息')
    print('\t\t\t\t\t\t  3.删除学生信息')
    print('\t\t\t\t\t\t  4.修改学生信息')
    print('\t\t\t\t\t\t  5.学生成绩排序')
    print('\t\t\t\t\t\t  6.统计学生总人数')
    print('\t\t\t\t\t\t  7.显示所有学生信息')
    print('\t\t\t\t\t\t  0.退出系统')
    print('-----------------------------------------------------------------------------')

def insert():
    student_list = []

    while True:
        id = input('请输入ID(如1001):')
        if not id:
            break
        name = input('请输入姓名:')
        if not name:
            break
        try:
            English = int(input('请输入英语成绩:'))
            Python = int(input('请输入Python成绩:'))
            Java = int(input('请输入Java成绩:'))

        except:
            print('输入无效,不是整数类型,请重新输入')
            continue
        # 将录入的学生信息保存到字典里
        student = {'id': id, 'name': name, 'English': English, 'Python': Python, 'Java': Java}
        # 将学生信息添加到列表中
        student_list.append(student)
        answer = input('是否继续添加?y/n\n')
        if answer =='y':
            continue
        else:
            break


    # 调用save()函数
    save(student_list)
    print('学生信息录入完毕!!!')

def save(list):
    try:
        # “a”进行写入,如果文件存在,则追加到文件末尾
        stu_txt = open(filename, 'a', encoding='utf-8')

    except:
        # “w”打开以进行写入,首先截断文件
        stu_txt = open(filename, 'w', encoding='utf-8')
    for item in list:
        stu_txt.write(str(item)+'\n')
    stu_txt.close()

def search():
    student_query = []
    while True:
        id = ''
        name = ''
        if os.path.exists(filename):
            mode = input('按ID查找请输入1:,按姓名查找请输入2:')
            if mode == '1':
                id = input('请输入学生ID(如1001):')
            elif mode == '2':
                name = input('请输入学生姓名:')
            else:
                print('您的输入有误,请重新输入!')
                search()
            with open(filename, 'r', encoding='utf-8') as rfile:
                student = rfile.readlines()
                for item in student:
                    d = dict(eval(item))
                    if 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()
            answer = input('是否要继续查询?y/n\n')
            if answer == 'y':
                continue
            else:
                break



        else:
            print('暂未保存此学生的信息!')
            return

def show_student(list):
    if len(list) == 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{:^10}\t{:^10}\t{:^10}\t{:^10}'
    for item in list:
        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():
   while True:
       student_id = input('请输入要删除的学生ID:')
       if student_id != '':
           # 判断文件是否存在
           if os.path.exists(filename):
               # 'r'打开以进行读取(默认)
               with open(filename, 'r', encoding='utf-8')as file:
                   # 将读取到的数据放到这个列表里面
                   student_old = file.readlines()
           else:
               student_old = []
           flag = False  # 标记是否删除
           if student_old:
               # “w”打开以进行写入,首先截断文件
               with open(filename, 'w', encoding='utf-8')as wfile:
                   # 空列表的作用:实现对原有信息的覆盖,删除操作,只需要将对应的信息不写入新的文件里即完成了删除操作
                   d = {}
                   # 遍历student_old列表
                   for item in student_old:
                       # 将字符串转换成字典
                       d = dict(eval(item))
                       # 判断要删除的学生在字典当中存在不存在
                       if d['id']!=student_id:
                           # 如果不相等的话,需要把这条信息写到文件里面,说明此条信息不是要删除的信息,应该要重新写入
                           wfile.write(str(d)+'\n')
                       else:
                           # flag = True表示已经删除了,因为flag = True的信息没有写入wfile文件里面,相当于删除了对应的信息
                           flag = True
                   if flag:
                       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():
    show()
    if os.path.exists(filename):
        with open(filename,'r', encoding= 'utf-8')as rfile:
            student_old = rfile.readlines()
    else:
        return
    student_id = input('请输入要修改的学生ID:')
    with open(filename, 'w', encoding= 'utf-8')as wfile:
        # 遍历student_old列表中的所有学生信息
        for item in student_old:
            # 将遍历的结果转换成为字典,存储在d中
            d = dict(eval(item))
            if d['id'] == student_id:
                print('找到了学生信息,可以修改他的相关信息了!')
                while True:
                    try:
                        d['name'] = input('请输入姓名:')
                        d['English'] = input('请输入English成绩:')
                        d['Python'] = input('请输入Python成绩:')
                        d['Java'] = input('请输入Java成绩:')
                    except:
                        # 如果输入的不正确,会继续执行循环语句
                        print('您的输入有误,请重新输入!!!')
                    else:
                        break
                # 跳出循环,将修改的信息写入到文件中去
                wfile.write(str(d) + '\n')
                print('修改成功!!!')
            # 对应没有找到相关信息的学生也要写进到文件里面
            else:
                wfile.write(str(d) + '\n')
        answer = input('是否继续修改其它学生的信息?y/n\n')
        if answer == 'y':
            modify()

def 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():
   if os.path.exists(filename):
       with open(filename, 'r', encoding="utf-8") as rfile:
           student = rfile.readlines()
           if student:
               print(f'一共有{len(student)}名学生。')
           else:
               print('还没有录入学生信息!!!')
   else:
       print("暂未保存数据信息...")

def show():
    student_list = []
    if os.path.exists(filename):
        with open(filename, 'r', encoding="utf-8") as rfile:
            student = rfile.readlines()
            for item in student:
                student_list.append(eval(item))
            if student_list :
                show_student(student_list)
            else:
                print('暂未保存学生信息...')


if __name__ == '__main__':
    main()
复制代码

结果展示:

 

posted @   tuyin  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示