吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3818|回复: 10
收起左侧

[Python 转载] 简单的学生信息管理系统案例分享

  [复制链接]
滚石唱片 发表于 2021-2-1 19:51
本帖最后由 滚石唱片 于 2021-2-1 19:55 编辑

初学Python2个多月,按照书中内容敲打了这个案例分享学习经验及个人总结
该案例使用re模块及os模块,以及文件的读写,基本基础知识能够玩转,鉴于尚未学到打包成.exe文件,虽然案例书中有讲,综合我的学习进度,我就不封装了,需要打包的可查看python的PyInstaller模块,这里就不做概述了,毕竟我也才开始学,欢迎大佬们批评指正。
功能简介:
添加学生及成绩信息;
将学生信息保存到文件中;
修改和删除学生信息;
查询学生信息,
根据学生成绩进行排序;
统计学生的总分.
截图信息:
343.png
[Python] 纯文本查看 复制代码
import re
import os

filename = "students.txt" # 数据文件

def menu():
    """输出菜单"""
    print("""
  ┏———————————————学生信息管理系统——————————————┓
  |                                                                            |
  |                                                                            |
  |        =========功能菜单=======                            |
  |                                                                            |
  |                                                                            |
  |        1 录入学生信息                                                      |
  |        2 查找学生信息                                                      |
  |        3 删除学生信息                                                      |
  |        4 修改学生信息                                                      |
  |        5 排序                                                              |
  |        6 统计学生总人数                                                    |
  |        7 显示所有学生信息                                                      |
  |        0 退出系统                                                          |
  |                                                                            |
  |                                                                            |
  |                                                                            |
  |        ====================                            |
  |        说明:通过数字或 ↑↓方向键选择菜单                                 |
  |                                                                            |
  |                                                                            |
  |                                                                            |
  |                                                                            |
  |                                                                            |
  └—————————————学生信息管理系统————————————————┘
    """)
# key按键

def main():    # 用户选择功能实现的类
    """创建一个学生信息管理系统"""
    ctrl = True  # 立flag
    while (ctrl):
        menu() #调用打印菜单的函数 首次显示初始化菜单,让用户输入对应序列号,
        option = input("请选择功能") #将用户选择的功能给一个变量    0-7用户输入的值赋给一个变量,便于判断
        option_str = re.sub("\D", "", option)    # re.sub("\D") 的作用是当用户输入了非数字是直接剔除,继续循环让用户输入对应数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str) # 将列表内的字符串内容转换为数字,进行接下来的判断
            if option_str == 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()

def insert():
    stdentList = [] # 学生列表,默认为空
    mark =True
    while mark:
        id = input("请输入ID(如1001):")
        if not 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()        # 关闭文件

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 != "":  # 判断是否按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() # 清空列表
                inputMark = input("是否继续查询? (Y/N): ")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂存保存数据信息....")
            return


def delete():
    mark = True
    while mark:   # 标记是否循环
        studentId = input("请输入要删除的学生ID:")
        if studentId !="":                    # 判断是否输入要删除的学生
            if not os.path.exists(filename):  # 判断文件是否存在
                continue
            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  # 退出删除学生信息功能


# 具体实现

def modify():   # 显示全部学生信息
    show()      # 判断文件是否存在
    if not os.path.exists(filename):
        return
    else:
        with open(filename,'r') as rfile:    # 打开文件
            student_old = rfile.readlines()  # 读取全部文件

    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"] = input("请输入英语成绩: ")
                        d["c"] = 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()  # 重新执行操作

#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
#    elif ascORdesc == "1":  # 按降序排序
#        ascORdescBool = 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":
#        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
#    elif mode == "3":
#        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)  # 显示排序结果

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
    elif ascORdesc == "1":  # 按降序排序
        ascORdescBool = 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)  # key 是按键  详情字典有讲
    elif mode == "2":
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":
        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)  # 显示排序结果

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("暂未保存数据信息....")
    # 将保存到列表中的学生信息显示出来

def show():
    student_new = []
    if os.path.exists(filename): # 判断文件是否存在
        with open(filename,'r')as rfile: # 打开文件
            student_old = rfile.readlines() #读取全部内容
        for list in student_old:
            student_new.append(eval(list)) #将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息....")

def show_student(studentList):
    if not studentList:   # 如果没有要显示的数据
        print("(o@.@o)无数据信息(o@.@o) \n")
        return
    # 定义标题显示格式
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID","名字","英语成绩","Python成绩","C语言成绩","总成绩")) # 按指定格式显示标题
    # 定义具体内容显示格式
    format_data ="{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    for info in studentList: # 通过for循环将列表中的数据全部显示出来
        print(format_data.format(info.get("id"),info.get("name"),str(info.get("english")),str(info.get("Python")),
                                                                    str(info.get("c")),
                                                                        str(info.get("english"))
                                                                            +info.get("python")+
                                                                            info.get("c").center(12)))

if __name__ == "__main__":
    main()

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
Stardustamy + 1 用心讨论,共获提升!
橘子好好吃 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ciker_li 发表于 2021-2-1 19:55
感谢分享
arq2020 发表于 2021-2-1 20:07
沉心云 发表于 2021-2-1 20:10
arq2020 发表于 2021-2-1 20:20
楼主,我打完包发到软件区可以吗,备注原帖地址
 楼主| 滚石唱片 发表于 2021-2-1 20:40
arq2020 发表于 2021-2-1 20:20
楼主,我打完包发到软件区可以吗,备注原帖地址

可以的,我也是照着书敲的,呵呵
 楼主| 滚石唱片 发表于 2021-2-1 20:45
沉心云 发表于 2021-2-1 20:10
楼主没用pycharm吗

都有vscode,pycharm都在学着用
weiwude 发表于 2021-2-2 07:31
谢谢分享
Doublevv 发表于 2021-2-2 17:02
挺好的小例程,谢谢分享
不过跑起来好像有小错误
光明城堡 发表于 2021-2-3 14:42
正好去运行试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表