系统设计

这个学生信息管理系统应该有添加学生信息、修改学生信息、删除学生信息、查找学生信息、显示所有学生信息、对学生信息进行排序、统计学生人数的功能。

先把主体框架的代码写好,再逐步把这些功能函数实现。以下是框架代码,在main()里的循环中输入0会退出循环,也就是会退出整个系统。输入1-7会进入对应的功能函数。如果输入的不是0-7,会提示输入非法!

import time
filename = 'student_info.txt' # 保存信息的文件


def main():
    while True:
        menu()  # 打印菜单函数
        choice = input('请输入你的选项:')
        if choice == '0':
            print('系统退出成功!')
            break 
        elif choice == '1':
            insert()    # 录入信息
        elif choice == '2':
            research()  # 查找信息
        elif choice == '3':
            delete()    # 删除信息
        elif choice == '4':
            change()    # 修改信息
        elif choice == '5':
            sort()      # 排序显示信息
        elif choice == '6':
            statistic() # 统计人数
        elif choice == '7':
            show_all()  # 打印所有信息
        else:
            print('输入非法,请重新输入!')
            time.sleep(1)   # 休眠1秒,防止没看到上面的打印
            continue


if __name__ == '__main__':
    main()

具体的函数实现

菜单函数

打印菜单。

def menu():
    print('''
===========学生信息管理系统===========
----------------菜单----------------
\t1.录入学生信息
\t2.查找学生信息
\t3.删除学生信息    
\t4.修改学生信息
\t5.对学生成绩进行排序
\t6.统计学生总人数
\t7.显示所有学生信息
\t0.退出系统    
-----------------------------------
''')

输出结果:

Python学生信息表与学生成绩表数据分析 python查询学生信息_python

录入学生信息函数

将输入的信息保存到字典,再保存到列表, 列表元素为字典,那么列表为:

[{'name': 'cc', 'id': 10001, 'python': 45.0, 'c': 98.0, 'cpp': 45.0}, {'name': 'www', 'id': 10003, 'python': 98.0, 'c': 65.0, 'cpp': 75.0}] 

def insert():
    while True:
        name = input('请输入姓名:')
        try:
            stu_id = int(input('请输入学号:'))
            python = float(input('请输入python成绩:'))
            c = float(input('请输入C语言成绩:'))
            cpp = float(input('请输入C++成绩:'))
        except:
            # 如果try里面的代码出现异常了(输入的数据不规范,比如学号中输入了一个a),就会执行except里面的代码
            print('输入的数据不规范,请重新输入!')
            time.sleep(1)
            continue
        break


    # 循环结束后,将录入的信息保存到字典中,有利于之后数据的查找、修改、排序
    d_stu = {'name': name, 'id': stu_id, 'python': python, 'c': c, 'cpp': cpp}
    lst_stu = []
    lst_stu.append(d_stu)  # 再将字典添加到列表中
    save(lst_stu)  # 使用自定义的save函数保存信息到文件,参数是列表
    print('学生信息已成功保存!')

为什么要添加一个save函数来保存信息,因为保存到文件的操作很频繁,所以封装成函数。函数的参数是一个列表,遍历列表得到列表元素字典,转为字符串(write函数的参数是字符串类型),再加上换行写入到文件。

那么文件中存储的信息如下所示:

{'name': 'cc', 'id': 10001, 'python': 45.0, 'c': 98.0, 'cpp': 45.0} {'name': 'www', 'id': 10003, 'python': 98.0, 'c': 65.0, 'cpp': 75.0} {'name': 'yyy', 'id': 10003, 'python': 56.0, 'c': 98.0, 'cpp': 78.0} {'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}

def save(lst):  # 将列表的元素都保存到文件中
    with open(filename, 'a', encoding='utf-8') as file: # 追加写方式打开文件
        for item in lst:
            file.write(str(item) + '\n')    # 将列表元素转为字符串再加上换行写入到文件中

修改学生信息函数 

先把文件的信息全部读取到列表old_lst中,列表如下所示:

["{'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}\n"]

遍历列表,列表元素是字符串如下:

"{'name': 'dfg', 'id': 10006, 'python': 98.0, 'c': 56.0, 'cpp': 45.0}\n"

此时使用eval函数去掉两边的引号,得到字典,\n会被自动去掉。

利用字典的性质判断要修改的学生的id是否与字典中'id'的值相等,相等的话就把新的信息输入,最后保存到文件。

def change():
    show_all()
    old_lst = []  # 保存文件的数据
    with open(filename, 'r', encoding='utf-8') as file:
        old_lst = file.readlines()
    stu_id = eval(input('请输入要修改的学生的id:'))
    with open(filename, 'w', encoding='utf-8') as file:
        for item in old_lst:
            d = dict(eval(item))
        if d['id'] == stu_id:
            print('找到了该学生!')
            while True:
                try:
                    d['name'] = input('请输入姓名:')
                    d['python'] = float(input('请输入python成绩:'))
                    d['c'] = float(input('请输入C语言成绩:'))
                    d['cpp'] = float(input('请输入C++成绩:'))
                except:
                    print('输入有误!')
                    time.sleep(1)
                break
            print('修改成功!')
        # 不管是不是该学生都要把数据写入到文件
        file.write(str(d) + '\n')

删除学生信息函数

def delete():
    flag = False  # 标记是否删除了数据
    while True:
        stu_id = eval(input('请输入要删除的学生的学号:'))
        if bool(stu_id):  # 不为空字符串
            old_lst = []    # 获取之前的数据
            with open(filename, 'r', encoding='utf-8') as rfile:
                old_lst = rfile.readlines()
            with open(filename, 'w', encoding='utf-8') as wfile:
                d = {}
                for item in old_lst:
                    d = dict(eval(item))  # 将每一行转为字典类型,方便查找学号
                    if d['id'] != stu_id:  # 不是要删除的数据,就写入到文件
                        wfile.write(str(d) + '\n')
                    else:
                        # 这为要删除的数据行,不写入文件,并把是否删除标记设为True
                        flag = True
                if flag:
                    print(f'成功删除了学号为{stu_id}的数据')
                else:
                    print(f'没有找到学号为{stu_id}的学生信息')
            break
        else:
            print('输入的学号为空,请重新输入!')
            continue

显示所有学生信息函数

def show_all():
    lst = []
    with open(filename, 'r', encoding='utf-8') as file:
        datas_lst = file.readlines()    # [['{}']['{}']]
        for item in datas_lst:
            lst.append(eval(item))  # 存放所有的数据的列表
        show_stu_lst(lst)

实现其中的show_stu_lst()函数,利用了format格式化字符串的方法。

def show_stu_lst(lst):
    if len(lst) == 0:    # 列表为空
        print('无数据显示')
        return
    else:

        # 定义标题显示格式
        format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'    # format格式化字符串
        print(format_title.format('id', '姓名', 'python成绩', 'C语言成绩', 'C++成绩', '总成绩'))

        # 定义内容的显示格式
        format_data = '{:^6}\t{:^12}\t{:^8}\t{:^14}\t{:^10}\t{:^10}'
        for item in lst:
            print(format_data.format(item.get('id'),
                                     item.get('name'),
                                     item.get('python'),
                                     item.get('c'),
                                     item.get('cpp'),
                                     (item.get('python') + item.get('c') + item.get('cpp'))
                                     ))

查找学生信息函数

def research():
    stu_lst = []  # 可能有同名的人,所以使用列表存储,可以存储多个人的信息
    r_id = ''
    r_name = ''
    while True:
        research_mode = input('1.按id查找\t2.按姓名查找,请输入:')
        if research_mode == '1':
            r_id = input('请输入要查找的id:')
            break
        elif research_mode == '2':
            r_name = input('请输入要查找的姓名:')
            break
        else:
            print('输入有误,请重新输入!')
            continue
    with open(filename, 'r', encoding='utf-8') as file:
        datas = file.readlines()
        for item in datas:
            d = dict(eval(item))    # 将列表元素去掉字符串再转为字典,利用字典来查找
            if r_id != '':  # 按id查找
                if d['id'] == int(r_id):
                    stu_lst.append(d)
            elif r_name != '':  # 按姓名查找
                if d['name'] == r_name:
                    stu_lst.append(d)

        # 显示查询结果
        show_stu_lst(stu_lst)

排序学生信息函数 

def sort():
    show_all()
    stu_lst = []
    with open(filename, 'r', encoding='utf-8') as file:
        datas_lst = file.readlines()
        for item in datas_lst:
            d = dict(eval(item))
            stu_lst.append(d)

    mode = ''  # 选择升序还是降序
    mode_bool = False
    sort_mode = ''  # 选择按什么数据排序
    while True:
        mode = input('0.降序 1.升序,请选择:')
        if mode == '0':
            mode_bool = True
            break
        elif mode == '1':
            mode_bool = False
            break
        else:
            print('输入错误,请重新输入。')
            continue
    while True:
        sort_mode = input('1.按python成绩 2.按c语言成绩 3.按c++成绩 4.按总成绩,请选择排序方式:')
        if sort_mode == '1':
            stu_lst.sort(key=lambda x: x['python'], reverse=mode_bool)
            break
        elif sort_mode == '2':
            stu_lst.sort(key=lambda x: x['c'], reverse=mode_bool)
            break
        elif sort_mode == '3':
            stu_lst.sort(key=lambda x: x['cpp'], reverse=mode_bool)
            break
        elif sort_mode == '4':
            stu_lst.sort(key=lambda x: x['c'] + x['cpp'] + x['python'], reverse=mode_bool)
            break
        else:
            print('输入不合法,请重新输入')
            continue

    show_stu_lst(stu_lst)

统计学生人数函数

def statistic():  # 统计总共有多少人
    with open(filename, 'r', encoding='utf-8') as file:
        datas = file.readlines()
        print(f'一个有{len(datas)}个学生')

完整代码

完整代码

import time
filename = 'student_info.txt'

def menu():
    print('''
===========学生信息管理系统===========
----------------菜单----------------
\t1.录入学生信息
\t2.查找学生信息
\t3.删除学生信息    
\t4.修改学生信息
\t5.对学生成绩进行排序
\t6.统计学生总人数
\t7.显示所有学生信息
\t0.退出系统    
-----------------------------------
''')


def save(lst):  # 将列表的元素都保存到文件中
    with open(filename, 'a', encoding='utf-8') as file: # 追加写方式打开文件
        for item in lst:
            file.write(str(item) + '\n')    # 将列表元素转为字符串再加上换行写入到文件中


def insert():
    while True:
        name = input('请输入姓名:')
        try:
            stu_id = int(input('请输入学号:'))
            python = float(input('请输入python成绩:'))
            c = float(input('请输入C语言成绩:'))
            cpp = float(input('请输入C++成绩:'))
        except:
            # 如果try里面的代码出现异常了,输入的数据不规范(不是整数、浮点数),就会执行except里面的代码
            print('输入的数据不规范,请重新输入!')
            time.sleep(1)
            continue
        break

    # 循环结束后,将录入的信息保存到字典中,有利于数据的查找、排序
    d_stu = {'name': name, 'id': stu_id, 'python': python, 'c': c, 'cpp': cpp}
    lst_stu = []
    lst_stu.append(d_stu)  # 再将字典添加到列表中
    save(lst_stu)  # 使用自定义的save函数保存信息到文件
    print('学生信息已成功保存!')


def research():
    stu_lst = []  # 可能有同名的人,所以使用列表存储,可以存储多个人的信息
    r_id = ''
    r_name = ''
    while True:
        research_mode = input('1.按id查找\t2.按姓名查找,请输入:')
        if research_mode == '1':
            r_id = input('请输入要查找的id:')
            break
        elif research_mode == '2':
            r_name = input('请输入要查找的姓名:')
            break
        else:
            print('输入有误,请重新输入!')
            continue
    with open(filename, 'r', encoding='utf-8') as file:
        datas = file.readlines()
        for item in datas:
            d = dict(eval(item))    # 将列表元素去掉字符串再转为字典,利用字典来查找
            if r_id != '':  # 按id查找
                if d['id'] == int(r_id):
                    stu_lst.append(d)
            elif r_name != '':  # 按姓名查找
                if d['name'] == r_name:
                    stu_lst.append(d)

        # 显示查询结果
        show_stu_lst(stu_lst)


def show_stu_lst(lst):
    if len(lst) == 0:
        print('无数据显示')
        return
    else:
        # 定义标题显示格式
        format_title = '{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
        print(format_title.format('id', '姓名', 'python成绩', 'C语言成绩', 'C++成绩', '总成绩'))

        # 定义内容的显示格式
        format_data = '{:^6}\t{:^12}\t{:^8}\t{:^14}\t{:^10}\t{:^10}'
        for item in lst:
            print(format_data.format(item.get('id'),
                                     item.get('name'),
                                     item.get('python'),
                                     item.get('c'),
                                     item.get('cpp'),
                                     (item.get('python') + item.get('c') + item.get('cpp'))
                                     ))


def delete():
    flag = False  # 标记是否删除了数据
    while True:
        stu_id = eval(input('请输入要删除的学生的学号:'))
        if bool(stu_id):  # 不为空字符串
            old_lst = []    # 获取之前的数据
            with open(filename, 'r', encoding='utf-8') as rfile:
                old_lst = rfile.readlines()
            with open(filename, 'w', encoding='utf-8') as wfile:
                d = {}
                for item in old_lst:
                    d = dict(eval(item))  # 将每一行转为字典类型,方便查找学号
                    if d['id'] != stu_id:  # 不是要删除的数据,就写入到文件
                        wfile.write(str(d) + '\n')
                    else:
                        # 这为要删除的数据行,不写入文件,并把是否删除标记设为True
                        flag = True
                if flag:
                    print(f'成功删除了学号为{stu_id}的数据')
                else:
                    print(f'没有找到学号为{stu_id}的学生信息')
            break
        else:
            print('输入的学号为空,请重新输入!')
            continue


def change():
    show_all()
    old_lst = []  # 保存文件的数据
    with open(filename, 'r', encoding='utf-8') as file:
        old_lst = file.readlines()
    stu_id = eval(input('请输入要修改的学生的id:'))
    with open(filename, 'w', encoding='utf-8') as file:
        for item in old_lst:
            d = dict(eval(item))
        if d['id'] == stu_id:
            print('找到了该学生!')
            while True:
                try:
                    d['name'] = input('请输入姓名:')
                    d['python'] = float(input('请输入python成绩:'))
                    d['c'] = float(input('请输入C语言成绩:'))
                    d['cpp'] = float(input('请输入C++成绩:'))
                except:
                    print('输入有误!')
                    time.sleep(1)
                break
            print('修改成功!')
        # 不管是不是该学生都要把数据写入到文件
        file.write(str(d) + '\n')


def sort():
    show_all()
    stu_lst = []
    with open(filename, 'r', encoding='utf-8') as file:
        datas_lst = file.readlines()
        for item in datas_lst:
            d = dict(eval(item))
            stu_lst.append(d)

    mode = ''  # 选择升序还是降序
    mode_bool = False
    sort_mode = ''  # 选择按什么数据排序
    while True:
        mode = input('0.降序 1.升序,请选择:')
        if mode == '0':
            mode_bool = True
            break
        elif mode == '1':
            mode_bool = False
            break
        else:
            print('输入错误,请重新输入。')
            continue
    while True:
        sort_mode = input('1.按python成绩 2.按c语言成绩 3.按c++成绩 4.按总成绩,请选择排序方式:')
        if sort_mode == '1':
            stu_lst.sort(key=lambda x: x['python'], reverse=mode_bool)
            break
        elif sort_mode == '2':
            stu_lst.sort(key=lambda x: x['c'], reverse=mode_bool)
            break
        elif sort_mode == '3':
            stu_lst.sort(key=lambda x: x['cpp'], reverse=mode_bool)
            break
        elif sort_mode == '4':
            stu_lst.sort(key=lambda x: x['c'] + x['cpp'] + x['python'], reverse=mode_bool)
            break
        else:
            print('输入不合法,请重新输入')
            continue

    show_stu_lst(stu_lst)


def statistic():  # 统计总共有多少人
    with open(filename, 'r', encoding='utf-8') as file:
        datas = file.readlines()
        print(f'一个有{len(datas)}个学生')


def show_all():
    lst = []
    with open(filename, 'r', encoding='utf-8') as file:
        datas_lst = file.readlines()    # [['{}']['{}']]
        for item in datas_lst:
            lst.append(eval(item))  # 存放所有的数据的列表
        show_stu_lst(lst)


def main():
    while True:
        menu()  # 打印菜单函数
        choice = input('请输入你的选项:')
        if choice == '0':
            print('系统退出成功!')
            break  # 退出系统
        elif choice == '1':
            insert()    # 录入
        elif choice == '2':
            research()  # 查找
        elif choice == '3':
            delete()    # 删除
        elif choice == '4':
            change()    # 修改
        elif choice == '5':
            sort()      # 排序显示
        elif choice == '6':
            statistic() # 统计人数
        elif choice == '7':
            show_all()  # 打印所有信息
        else:
            print('输入非法,请重新输入!')
            time.sleep(1)   # 休眠1秒,防止没看到上面的打印
            continue


if __name__ == '__main__':
    main()

运行结果

Python学生信息表与学生成绩表数据分析 python查询学生信息_python_02

Python学生信息表与学生成绩表数据分析 python查询学生信息_数据_03

Python学生信息表与学生成绩表数据分析 python查询学生信息_字符串_04

Python学生信息表与学生成绩表数据分析 python查询学生信息_数据_05