当前位置:   article > 正文

python学生信息管理系统_python学生管理系统实践分析

python学生管理系统实践分析


前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能从入门到精通教程




1、需求分析
2、系统设计
3、系统开发必备
4、主函数设计
5、学生信息维护模块设计
6、查询/统计模块设计
7、排序模块设计
8、项目打包

需求分析

系统功能结构

  • 学生信息管理系统的7大模块
    • 录入学生信息模块
    • 查找学生信息模块
    • 删除学生信息模块
    • 修改学生信息模块
    • 学生成绩排名模块
    • 统计学生总人数模块
    • 显示全部学生信息模块

系统设计

学生信息管理系统

  • 学生信息维护
    • 录入学生信息
    • 删除学生信息
    • 修改学生信息
  • 查询/统计
    • 按学生姓名查找
    • 按学生ID查找
    • 查询并显示所有学生信息
    • 统计学生总人数
  • 排序
    • 升序
      • 根据英语成绩排序
      • 根据python成绩排序
      • 根据Java成绩排序
      • 根据总成绩排序
    • 降序
      • 根据英语成绩排序
      • 根据python成绩排序
      • 根据Java成绩排序
      • 根据总成绩排序

系统开发必备

  • 系统开发环境
    • 操作系统win1
    • python解释器版本:python3.8
    • 开发工具:pycharm
    • python内置模块:os,re
  • 项目目录结构
    在这里插入图片描述

主函数设计

系统主界面运行效果图
在这里插入图片描述

实现主函数

编号功能
0退出系统
1录入学生信息,调用insert()函数
2查找学生信息,调用search()函数
3删除学生信息,调用delete()函数
4修改学生信息,调用modify()函数
5对学生成绩排序,调用sort()函数
6统计学生总人数,调用total()函数
7显示所有的学会信息,调用show()函数

代码

stusystem.py

import os
filename = 'students.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()           # 显示学生信息
        else:
            print('输入错误!!!')


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


def insert():
    """录入学生信息,并存储"""
    student_list = []   # 用于存储学生信息的列表
    while True:
        id = input('请输入ID(001到100整数):')
        if not id:      # 录入的ID为空,如enter键什么的
            break       # 退出循环

        """确保输入整数"""
        try:
            a = int(id)   # 输入的ID不是整数
        except:
            print('输入ID错误,请重新输入')
            continue

        """确保输入100内整数"""
        if int(id) not in range(1, 101):
            print('输入ID超过100,请重新输入')
            continue

        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      # 跳出录入的循环,但是还在main的循环

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


def save(lst):
    """存储学生信息"""
    try:  # 追加模式打开,encoding防止中文乱码
        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():
    """查找学生信息:
    1.按ID查找
    2.按姓名查找"""
    student_query = []                                    # 存储需要查询的信息
    while True:
        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', encoding='utf-8') as rfile:  # 以读的形式打开
                student = rfile.readlines()                       # 将包含字典的字符串放入列表中
                for item in student:                              # 遍历列表中的字符串形式的字典
                    d = dict(eval(item))                          # 剥掉引号,转为字典

                    if id != '':                                  # 如果输入的ID不为空
                        if d['id'] == id:                         # 输入的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')
            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():
    """删除学生信息"""
    show()
    while True:
        student_id = input('请输入学生ID:')                             # 输入要删除的学生ID
        if student_id != '':                                          # 输入的ID不为空
            if os.path.exists(filename):                              # 如果存在filename文件
                with open(filename, 'r', encoding='utf-8') as file:   # 以读的形式打开文件
                    student_old = file.readlines()                    # 将每一行元素作为独立字符串,放入列表当中
            else:
                student_old = []

            flag = False                                              # 标记是否删除,初始化False
            if student_old:                                           # 不为空
                with open(filename, 'w', encoding='utf-8') as wfile:  # 以写的形式打开
                    #d = {}
                    for item in student_old:                          # 遍历列表中字符串
                        # eval剥去引号,dict转为字典
                        d = dict(eval(item))                          # 将字符串转换成字典
                        if d['id'] != student_id:                     # w是清空文件的方法写入
                            wfile.write(str(d)+'\n')                  # 这里写入除了要查询的以外的所有内容
                        else:
                            flag = True

                    if flag:
                        print(f'id为{student_id}的学生信息已被删除')      # 字符串格式化
                    else:
                        print(f'没有找到ID为{student_id}的学生信息')
            else:                                                     # TXT文件中无信息时
                print('无学生信息')
                break
            show()   # 删除之后要重新显示所有学生信息
            answer = input('是否继续删除?y/n\n')
            if answer == 'y':
                continue
            else:
                break


def modify():
    """修改学生信息"""
    show()
    flag = True
    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:      # 以写的形式打开
        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('您的输入有误,请重新输入:')
                    else:
                        break              # 输入完后就退出循环

                wfile.write(str(d)+'\n')   # 修改后的重新写入,w是不保留原来的
                #print('修改成功!!!')
            else:       # 输入的学号不存在
                wfile.write(str(d)+'\n')   # 写入空字符
                #print('对不起,没有你要查找的ID!')
                flag = False

            if not flag:
                print('对不起,没有你要查找的ID!')
            else:
                print('修改成功!!!')

        answer = input('是否继续修改其他学生信息呢?y/n\n')
        if answer == 'y':
            modify()


def sort():
    """排序模块
    1.升序
    2.降序
    又细分为:
    1.按英语成绩
    2.按python
    3.按Java
    4.按总成绩"""
    show()                              # 先显示所有的学生信息
    if os.path.exists(filename):        # 文件存在
        with open(filename, 'r', encoding='utf-8') as rfile:
            studet_list = rfile.readlines()   # 将每一行元素作为独立字符串,放入列表当中
        student_new = []                      # 之后把所有信息添加到这里
        for item in studet_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_boll = False
    elif asc_or_desc == '1':
        asc_or_desc_boll = 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_boll)
    elif mode == '2':
        student_new.sort(key=lambda x: int(x['python']), reverse=asc_or_desc_boll)
    elif mode == '3':
        student_new.sort(key=lambda x: int(x['java']), reverse=asc_or_desc_boll)
    elif mode == '0':
        student_new.sort(key=lambda x: int(x['english'])+int(x['python'])+int(x['java']), reverse=asc_or_desc_boll)
    else:
        print('您的输入有误,请重新输入!!!')
        sort()

    show_student(student_new)    # 展示排序后的


def total():
    """显示总共多少名学生"""
    if os.path.exists(filename):                              # 如果文件存在
        with open(filename, 'r', encoding='utf-8') as rfile:  # 只读方式打开
            students = rfile.readlines()                      # 将每一行元素作为独立字符串,放入列表当中
            if students:                                      # 列表不为空
                print(f'一共有{len(students)}名学生')           # 统计列表长度,即为学生个数
            else:
                print('还没有录入学生信息')
    else:
        print('暂未保存信息')


def 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340

统计学生信息的TXT文件:
students.txt,这个是会自动录入信息的时候回自动生成
在这里插入图片描述

打包

将.py文件打包成.exe文件请参考视频教程
打包教程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/747029
推荐阅读
相关标签
  

闽ICP备14008679号