简易学生信息管理系统(Python版)

用Python控制台完成一个简易的学生信息管理,主要涉及到基本语法、函数、流程控制、列表字典等知识,最后将py文件打包成exe可执行文件。

主界面运行效果如下:

系统设计主要功能模块:

 

系统开发环境:windows、Python3,8、Pycharm、以及Python内置模块os

项目目录结构:

stusystem.py完整代码:

# -*- coding: utf-8 -*-
# @Time : 2020/12/15 8:47
# @Author : hanrui

import os

#判断磁盘文件中该id的学生是否已经存在
#存在返回True,不存在返回False
def isId_exist(filename,stu_id):
    is_exist = False
    file = open(filename,'r')
    if os.path.getsize(filename):
        lst = file.readlines()  #读取的每行学生信息格式:{'id': '1', 'stu_name': 'hanrui', 'english': 1.0, 'python': 1.0, 'java': 1.0}
        for item in lst:
            stu = dict(eval(item))  #将字符串转为字典
            if stu['id'] == stu_id:
                is_exist = True
    return is_exist

#判断磁盘文件中该name的学生是否已经存在
#存在返回True,不存在返回False
def isName_exist(filename,stu_name):
    is_exist = False
    file = open(filename, 'r')
    if os.path.getsize(filename):
        lst = file.readlines()  # 读取的每行学生信息格式:{'id': '1', 'stu_name': 'hanrui', 'english': 1.0, 'python': 1.0, 'java': 1.0}
        for item in lst:
            stu = dict(eval(item))  # 将字符串转为字典
            if stu['stu_name'] == stu_name:
                is_exist = True
    return is_exist

#将学生信息写到磁盘文件中
def save(filename,string):
    with open(filename,'a') as  file:
        file.write(string+'\n')

'''
从控制台录入学生信息,并把他们保存到磁盘文件student.txt中
学生成绩包括:学生id,学生姓名,英语成绩,python成绩和java成绩
在student.txt中以字典格式存储
'''
def insert(filename):
    while True:
        stu_id = input('请输入学生ID:')
        # 学生id非空且学生id不存在时
        if stu_id.strip() == '':   # 或者if not stu_id,因为空字符串的布尔值为False
            print('学生ID不可为空')
            continue
        if not isId_exist(filename,stu_id):
            stu_name = input('请输入学生姓名:')
            while stu_name.strip() == '':
                stu_name = input('学生姓名不可为空,请重新输入学生姓名')
            try:
                english = float(input('请输入该学生英语成绩:'))
                while english < 0 or english >100:
                    english = float(input('分数不在合理范围内,请重新输入该学生英语成绩:'))
                python = float(input('请输入该学生python成绩:'))
                while python < 0 or python > 100:
                    python = float(input('分数不在合理范围内,请重新输入该学生python成绩:'))
                java = float(input('请输入该学生java成绩:'))
                while java < 0 or java > 100:
                    java = float(input('分数不在合理范围内,请重新输入该学生java成绩:'))
            except ValueError:
                print('学生成绩必须是0-100之间的数字噢!')
            dict = {'id':stu_id,'stu_name':stu_name,'english':english,'python':python,'java':java}
            save(filename,str(dict))
            choice = input('是否继续录入?(输入y或n)')
            if choice == 'y' or choice == 'Y':
                continue
            else:
                print('成功录入学生信息')
                break
        #学生id存在,可以选择修改该学生信息,或者继续录入其他学生
        else:
            choice = input('该学生已经存在,是否修改该学生信息?(输入y或n)')
            if choice == 'y' or choice == 'Y':
                modify(filename)
            else:
                choice = input('是否继续录入学生信息?(输入y或n)')
                if choice == 'y' or choice == 'Y':
                    continue
                else:
                    break

'''
从控制台录入学生ID或姓名,到磁盘文件中找到对应的学生信息
'''
def search(filename):
    while True:
        if os.path.exists(filename):
            stu_search = input('请输入要查找的学生ID或学生姓名:')
            stu_find = []
            with open(filename,'r') as file:
                lst = file.readlines()
                flag = False
                for item in lst:
                    d = dict(eval(item))
                    if d['id'] == stu_search or d['stu_name'] == stu_search:
                        flag = True
                        stu_find.append(item)
                if flag:
                    show_lst(stu_find)
                else:
                    print('很抱歉,没有查询到该学生,无数据显示。')
                choice = input('是否继续查询(输入y或n)?')
                if choice == 'y' or choice == 'Y':
                    continue
                else:
                    break
        else:
            print('查询失败,学生信息文件不存在')

'''
从控制台录入学生ID,到磁盘文件中找到对应的学生信息,并将其删除
'''
def delete(filename,stu_id=None):
    while True:
        if stu_id == None:
            stu_id = input('请输入要删除的学生ID:')
        students = []
        if os.path.exists(filename) and isId_exist(filename, stu_id):
            with open(filename,'r',encoding='utf-8') as file:
                lst = file.readlines()
            for item in lst:
                stu = dict(eval(item))  # 将字符串转换为字典
                if stu['id'] == stu_id:
                    continue
                else:
                    students.append(stu)
            os.remove(filename)
            for stu in students:
                save(filename, str(stu))
            print('删除成功,已将ID为' + stu_id + '的学生信息删除')
        elif not isId_exist(filename, stu_id):
            print(f'删除失败,ID为{stu_id}的学生不存在。')
        elif not os.path.exists(filename):
            print('删除失败,学生信息文件不存在。')

        choice = input('是否继续删除学生信息?(输入y或n)')
        if choice =='y' or choice == 'Y':
            continue
        else:
            break

'''
从控制台录入学生ID,到磁盘文件中找到对应的学生信息,将其进行修改
'''
def modify(filename):
    while True:
        stu_id = input('请输入要修改的学生ID:')
        if os.path.exists(filename) and isId_exist(filename,stu_id):
            students = []
            with open(filename,'r') as file:
                lst = file.readlines()
            for item in lst:
                stu = dict(eval(item))
                if stu['id'] == stu_id:
                    new_id = input('输入修改后的学生ID(不修改请直接回车):')
                    if new_id == '':   #没有输入修改值,则默认不改变
                        new_id = stu['id']
                    new_name = input('输入修改后的学生姓名(不修改请直接回车):')
                    if new_name == '':
                        new_name = stu['stu_name']
                    try:
                        new_python = float(input('输入修改后的python成绩(不修改请直接回车):'))
                        if new_python == '':
                            new_python = stu['python']
                        while new_python < 0 or new_python > 100:
                            new_python = float(input('分数不在合理范围内,请重新输入该学生的python成绩:'))
                        new_english = float(input('输入修改后的english成绩(不修改请直接回车):'))
                        if new_english == '':
                            new_english = stu['english']
                        while new_english < 0 or new_english > 100:
                            new_english = float(input('分数不在合理范围内,请重新输入该学生的english成绩:'))
                        new_java = float(input('输入修改后的java成绩(不修改请直接回车):'))
                        if new_java == '':
                            new_java = stu['java']
                        while new_java < 0 or new_java > 100:
                            new_java = float(input('分数不在合理范围内,请重新输入该学生的java成绩:'))
                    except ValueError:
                        print('学生成绩必须是0-100之间的数字噢!')
                        continue
                    d = {'id':new_id,'stu_name':new_name,'english':new_english,'python':new_python,'java':new_java}
                    students.append(str(d))
                else:
                    students.append(stu)
            os.remove(filename)
            for student in students:
                save(filename,str(student))
            print('修改成功,学生信息已更新')
        elif not isId_exist(filename, stu_id):
            print(f'修改失败,ID为{stu_id}的学生不存在。')
        elif not os.path.exists(filename):
            print('修改失败,学生信息文件不存在。')
        choice = input('是否继续修改其他学生信息?(输入y或n)')
        if choice =='y' or choice == 'Y':
            continue
        else:
            break

'''
主要对学生信息按英语成绩、Python成绩、java成绩、总成绩进行升序或降序排序
'''
def sort(filename):
    if os.path.exists(filename):
        with open(filename,'r',encoding='utf-8') as file:
            student_list = file.readlines()
        student_dict = []
        #读取文件中的每一行是以字符串形式,将每一行字符串转成字典重新添加到列表中
        for item in student_list:
            student_dict.append(dict(eval(item)))

        subject = input('按英语成绩排序请选1,按Python成绩排序请选2,按java成绩排序请选3,按总成绩排序请选4:')
        asc_or_desc  = input('升序请选1,降序请选2:')
        if asc_or_desc =='1':
            desc = False
        elif asc_or_desc == '2':
            desc = True
        else:
            print('输入有误,请重新输入')
            sort(filename)
        if subject == '1':
            student_dict.sort(key=lambda x: float(x['english']), reverse=desc)
        elif subject == '2':
            student_dict.sort(key=lambda x: float(x['python']), reverse=desc)
        elif subject == '3':
            student_dict.sort(key=lambda x: float(x['java']), reverse=desc)
        elif subject == '4':
            student_dict.sort(key=lambda x: float(x['english'])+float(x['python'])+float(x['java']), reverse=desc)
        else:
            print('输入有误,请重新输入')
            sort(filename)
        student_list.clear()
        for item in student_dict:
            student_list.append(str(item))
        show_lst(student_list)
    else:
        print('排序失败,学生信息文件不存在')

#统计学生信息文件中的学生总人数
def total(filename):
    if os.path.exists(filename):
        with open(filename,'r') as file:
            lst = file.readlines()
            if len(lst) == 0 :
                print('还没有录入学生信息,总共有0名同学')
                return
            else:
                print(f'总共有{len(lst)}名同学')
    else :
        print('学生信息文件不存在,无法统计')

#将列表中的学生信息显示
def show_lst(lst):
    # 定义标题显示格式
    format_title = '{:^6}\t{:^10}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
    # 定义内容显示格式
    format_content = '{:^6}\t{:^12}\t{:^8}\t{:^6}\t{:^24}\t{:^0}'
    if len(lst) != 0 :
        print(format_title.format('ID', '姓名', '英语成绩', 'Python成绩', 'Java成绩', '总成绩'))
        for item in lst:
            d = dict(eval(item))
            print(format_content.format(d['id'],d['stu_name'],d['english'],d['python'],d['java'],d['english']+d['python']+d['java']))
    else:
        print('无数据显示')

#将学生信息文件student.txt中保存的所有学生信息获取并显示出来
def show_all(filename):
    if os.path.exists(filename):
        with open(filename, 'r') as file:
            lst = file.readlines()
        show_lst(lst)
    else:
        print('显示失败,学生信息文件不存在')

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

#主函数
def main(filename):
    while True:
        menu()  #显示菜单
        try:
            choice = int(input('请选择功能(输入数字1-8):'))
            if choice < 1 or choice > 8:
                print('输入错误,请重新输入。')
                continue
            elif choice == 1:
                insert(filename)
            elif choice == 2:
                search(filename)
            elif choice == 3:
                delete(filename)
            elif choice == 4:
                modify(filename)
            elif choice == 5:
                sort(filename)
            elif choice == 6:
                total(filename)
            elif choice == 7:
                show_all(filename)
            elif choice == 8:
                answer = input('确定退出系统吗(输入y或n):')
                if answer == 'y' or answer == 'Y':
                    print('~~~~~~~~~~~~~~感谢使用~~~~~~~~~~~~~~')
                    break
                else:
                    continue
        except ValueError:
            print('输入错误数字,请重新输入。')


if __name__ == '__main__':
    filename = 'student.txt'
    open(filename,'a')
    main(filename)

项目打包:

首先打开命令行安装第三方模块:pip install PyInstaller

然后使用:pyinstaller -F C:\Users\Administrator\PycharmProjects\StudentInformationManagement\stusystem.py

-F 表示只生成一个扩展名为.exe的可执行文件,后面是要打包的文件的位置

可以看到生成的exe可执行文件在C:\Users\Administrator\dist\stusystem.exe,双击运行exe文件可看到:

  • 8
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值