[Python基础] 学生管理系统(存储读取学生信息)

news2024/9/23 21:26:46

学生管理系统:应该算是语言语法学习过程中一个比较适合测试语法熟练度的代码案例了。

文章目录

  • 思路
    • main(入口函数)
    • menu(菜单)
    • Add(新增学生)
    • Display()(显示学生)
    • Find()(查找学生)
    • Delete()(删除学生)
    • save()(存储数据)
    • load()(读取数据)
  • 完整代码

思路

创建一个全局的students列表,列表中每个元素为字典类型,每个字典存放一个学生的所有信息。

通过入口函数链接所有操作

# 用一个全局变量存学生信息
# 该全局变量为列表,列表中每个元素都是字典,字典中存放一个学生的所有信息
students = []

main(入口函数)

  1. 开始前先读取数据,调用load()
  2. 通过一个while循环,进行不断的学习管理的相关操作,用choice接收menu的返回值,进行判断将执行哪个操作
def main():
    # 入口函数

    # 通过控制台交互
    print("---------------------------------------------------")
    print("                    学生管理系统                     ")
    print("---------------------------------------------------")

	# 开始前读取数据
	load()

    while True:
        # menu() 菜单
        choice = menu()
        if choice == '1':
            Add()
        elif choice == '2':
            Display()
        elif choice == '3':
            Find()
        elif choice == '4':
            Delete()
        elif choice == '0':
            print("学生管理系统: 退出成功!")
            sys.exit(0)
        else:
            print("输入有误, 重新输入")

main()

menu(菜单)

  1. 菜单选项对应入口函数的选项,输入选项后返回给入口函数接收
def menu():
    print("---------------------------------------------------")
    print("1. 新增学生")
    print("2. 显示学生")
    print("3. 查找学生")
    print("4. 删除学生")
    print("0. 退出系统")
    print("---------------------------------------------------")

    choice = input("请输入选择: ")
    return choice

Add(新增学生)

  1. 学生设置四个属性:学号、姓名、性别、班级
  2. 用一个字典将学生的四个属性聚合起来,最后将字典添加到students列表中
  3. 最后进行save()(存储学生信息到文件)
def Add():
    print("[新增学生]: 开始")
    # 学号
    studentId = input("输入学号: ")
    # 姓名
    name = input("输入姓名: ")
    # 性别
    gender = input("输入性别: ")
    # 班级
    className = input("输入班级: ")

    # 用字典将学生信息聚合
    student = {
        'studentId' : studentId,
        'name' : name,
        'gender' : gender,
        'className' : className
    }

    global students
    students.append(student)    #将该学生写入列表中

    # 保存学生信息
    save()

    print("[新增学生]: 完成")

效果演示:
在这里插入图片描述

Display()(显示学生)

  1. 直接利用for循环遍历students列表,s代表列表中的每个元素,为字典类型,打印s的所有元素即可
def Display():
    print("[显示学生]: 开始")
    for s in students:
        print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
    print(f"[显示学生]: 完成\t共显示了{len(students)}条信息")

效果演示:
在这里插入图片描述

Find()(查找学生)

  1. 查找思路和显示相差不大,先输入要查找的学生姓名
  2. 遍历列表,通过对比输入的name,和每个学生的name,然后打印相应学生信息
  3. 由于会出现重名问题,最后也可以打印一共查找到相匹配学生的个数
def Find():
    print("[查找学生]: 开始")
    name = input("请输入要查找的学生姓名: ")
    count = 0   # 记录查找到的学生总数
    for s in students:
        if name == s['name']:
            print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
            count += 1

    print(f"[查找学生]: 完成\t共查找到{count}个匹配的学生")

效果演示:
在这里插入图片描述

Delete()(删除学生)

  1. 同样利用for循环遍历,通过对比输入的学号和列表中每个字典存储的学号
  2. 如果有该学生,利用remove()函数删除该学生
def Delete():
    print("[删除学生]:开始")
    studentId = input("输入要删除的学生的学号: ")

    for s in students:
        if(studentId == s['studentId']):
            print(f"删除了学生{s['name']}")
            students.remove(s)  #列表调用remove进行删除

    # 保存此时数据
    save()

    print("[删除学生]:完成")

效果演示:
在这里插入图片描述

save()(存储数据)

  1. 使用 with open() 语句来打开一个名为 data.txt 的文本文件,并指定了打开方式为写入模式和编码方式为 utf8
  2. 遍历 students 列表,将每个学生的信息写入到文件中
  3. 字符串格式化功能被用来将字典中的学生信息格式化为一行字符串,并使用制表符 \t 分隔。
def save():
    # 存储学生信息
    with open('data.txt','w',encoding='utf8') as f:
        for s in students:
            f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
        print(f'[存储数据成功] 共存储了 {len(students)} 条数据')

此时data.txt中的存储情况
在这里插入图片描述

load()(读取数据)

  1. 如果不存在data.txt文件,直接返回,不执行操作
  2. 读取数据前清空students,同样的操作,以’r’的方式打开data.txt
  3. 由于一个学生信息为四个元素,首先去掉line的左右两边空格;后用split()函数分割 (以’\t’为分隔符进行分割,返回值类型是list) ,用tokens接收分割后的一个结果,如果长度不为4,证明该处出现问题,continue
  4. 切分完成后,用字典student接收tokens的每个元素,最后读取到列表students中
def load():
    # 读档
    # 如果文件不存在,直接返回,不再读档
    if not os.path.exists('data.txt'):
        return

    # 读档前保证students中没有数据
    global students
    students = []

    with open('data.txt', 'r', encoding='utf8') as f:
        for line in f:  # 每次切分f的一个学生数据
            line.strip()    # 去掉字符串两边的空格
            tokens = line.split('\t')   # 以'\t'为分隔符分割line - 返回值是list(列表)
            if len(tokens) != 4:
                print(f"当前行格式有问题: line={line}")
                continue
            # 此时切分完成
            student = {
                'studentId' : tokens[0],
                'name' : tokens[1],
                'gender' : tokens[2],
                'className' : tokens[3]
            }
            # 将元素读取到students中
            students.append(student)
        print(f"[读取数据成功] 共读取了 {len(students)} 条数据")

完整代码

import os.path
import sys


def menu():
    print("---------------------------------------------------")
    print("1. 新增学生")
    print("2. 显示学生")
    print("3. 查找学生")
    print("4. 删除学生")
    print("0. 退出系统")
    print("---------------------------------------------------")

    choice = input("请输入选择: ")
    return choice

# 用一个全局变量存学生信息
# 该全局变量为列表,列表中每个元素都是字典,字典中存放一个学生的所有信息
students = []

def save():
    # 存储学生信息
    with open('data.txt','w',encoding='utf8') as f:
        for s in students:
            f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}")
        print(f'[存储数据成功] 共存储了 {len(students)} 条数据')

def load():
    # 读档
    # 如果文件不存在,直接返回,不再读档
    if not os.path.exists('data.txt'):
        return

    # 读档前保证students中没有数据
    global students
    students = []

    with open('data.txt', 'r', encoding='utf8') as f:
        for line in f:  # 每次切分f的一行(一个学生数据)
            line.strip()    # 去掉字符串两边的空格
            tokens = line.split('\t')   # 以'\t'为分隔符分割line - 返回值是list(列表)
            if len(tokens) != 4:
                print(f"当前行格式有问题: line={line}")
                continue
            # 此时切分完成
            student = {
                'studentId' : tokens[0],
                'name' : tokens[1],
                'gender' : tokens[2],
                'className' : tokens[3]
            }
            # 将元素读取到students中
            students.append(student)
        print(f"[读取数据成功] 共读取了 {len(students)} 条数据")
def Add():
    print("[新增学生]: 开始")
    # 学号
    studentId = input("输入学号: ")
    # 姓名
    name = input("输入姓名: ")
    # 性别
    gender = input("输入性别: ")
    # 判断性别是否有误
    # if(gender not in('男', '女')):
    #     print("输入性别不符合要求: 新增学生失败")
    #     return
    # 班级
    className = input("输入班级: ")

    # 用字典将学生信息聚合
    student = {
        'studentId' : studentId,
        'name' : name,
        'gender' : gender,
        'className' : className
    }

    global students
    students.append(student)    #将该学生写入列表中

    # 保存学生信息
    save()

    print("[新增学生]: 完成")

def Display():
    print("[显示学生]: 开始")
    for s in students:
        print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
    print(f'[显示学生] 完成:  共显示了 {len(students)} 条数据!')

def Find():
    print("[查找学生]: 开始")
    name = input("请输入要查找的学生姓名: ")
    count = 0   # 记录查找到的学生总数
    for s in students:
        if name == s['name']:
            print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
            count += 1

    print(f"[查找学生]: 完成\t共查找到{count}个匹配的学生")

def Delete():
    print("[删除学生]:开始")
    studentId = input("输入要删除的学生的学号: ")

    for s in students:
        if(studentId == s['studentId']):
            print(f"删除了学生{s['name']}")
            students.remove(s)  #列表调用remove进行删除

    # 保存此时数据
    save()

    print("[删除学生]:完成")


def main():
    # 入口函数(主函数)

    # 通过控制台交互
    print("---------------------------------------------------")
    print("                    学生管理系统                     ")
    print("---------------------------------------------------")

    # 开始前先调用load,读取数据
    load()

    while True:
        # menu() 菜单
        choice = menu()
        if choice == '1':
            Add()
        elif choice == '2':
            Display()
        elif choice == '3':
            Find()
        elif choice == '4':
            Delete()
        elif choice == '0':
            print("学生管理系统: 退出成功!")
            sys.exit(0)
        else:
            print("输入有误, 重新输入")

main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

::before和::after伪元素的用法案例

CSS3中伪类采用单冒号写法,伪元素采用双冒号写法。 伪类举例——:hover,:link,:active,:target。 伪元素举例——::before,::after,::first-letter,::first-line,::selection。 一、介绍 今天写网页时遇到一个问题,视口的背景中插入一个小图标的话&a…

Python进阶项目--只因博客(bootstrap+flask+mysql)

前言 1.全民制作人们大家好,我是练习时长两年半的个人练习生只因坤坤,喜欢唱,跳,rap,篮球,music......在今后的节目中,我还准备了很多我自己作词、作曲、编舞的原创作品,期待的话&am…

VirtualBox虚拟机后台运行

前言 在Windows下的VirtualBox运行如Linux的虚拟机时,并不需要图形化的界面,我们不必次次通过VirtualBox的官方界面进入,解决鼠标键盘定位等问题。可以通过Putty等软件使用SSH进行连接控制,但是官方界面并没有在后台运行选项。 需…

Nginx快速上手~

注:本文针对官网的快速入门教程进行一个中文的解释,以帮助英文阅读能力较差的学习者快速上手 参考官网连接Beginners Guide (nginx.org) Centos下的安装 sudo yum install yum-utils # 创建文件 vim /etc/yum.repos.d/nginx.repo # 输入以下内容 ####…

项目1实现登录功能方案设计第四版

需求 优化点:MySQL表常用功能模块实现方案 index页面home页面 需求 实现一个登录功能 实现的功能 注册(邮箱注册) 登录(邮箱密码) 重置密码 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) 登出 在第3版的基础上进行优化:\ 优化点: 接口设计 1. 发送注册验证码: 路径: PO…

五一将迎2亿人次出行,君子签助力旅行社合规高效签旅游电子合同

近日,为规范旅游市场秩序,促进旅行社高质量发展,文旅部发布了《文化和旅游部办公厅关于进一步规范旅游市场秩序的通知》(下称《通知》),对旅游业提出了新的要求。 《通知》中规范了旅行社经营行为。旅行社要…

flink任务处理下线流水数据,数据遗漏不全(三)

flink任务处理下线流水数据,数据遗漏不全(二) 居然还是重量,做一个判断,如果是NaN 就直接获取原始的数据的重量 测试后面会不会出现这个情况! 发现chunjun的代码运行不到5h以后,如果网络不稳…

EasyCVR平台基于GB28181协议的语音对讲配置操作

EasyCVR基于云边端协同,具有强大的数据接入、处理及分发能力,平台可支持海量视频的轻量化接入与汇聚管理,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…

IT行业里的热门技术

© Ptw-cwl 文章目录 1. 人工智能(AI)和机器学习(ML)2. 大数据3. Web2.04. 移动应用程序开发5. 物联网6. 云计算7. 区块链8. 5G技术9. 虚拟现实(VR)和增强现实(AR) 现在如果问…

如何使用Midjourney辅助建筑设计,常用的提示和使用效果展示(内附Midjourney提示词网站)

文章目录 一.Midjourney建筑设计的提示技巧1. prompt模板12.prompt模板2 二、著名建筑师为例1.Zaha Hadid(扎哈哈迪德)2.Ludwig Mies van der Rohe(路德维希密斯凡德罗)3.Renzo Piano(皮亚诺)4.Stefano Boe…

PEIS源码,体检管理系统源码,C#医院体检系统源码

PEIS体检管理系统源码,医院体检系统源码PEIS源码,商业级源码,有演示。 PEIS医院体检管理系统采用C/S结构,前台开发工具为Vs2012,后台数据库采用oracle大型数据库。核心功能有:体检档案的录入、体检报告的输…

从入门到精通:SEO站外优化全面解析

通过​​第三章​​上下连续两期的干货内容,相信你已经掌握了 SEO 优化的基本方法,但你有没有发现:之前的内容都是针对网站本身进行优化的方法,其实,SEO 还有相当一部分功夫要放在站外优化上。 问题来了:站…

上海震坤行工业超市聚焦量具量仪市场,助力企业实现测量数字化

上海震坤行工业超市聚焦量具量仪市场,助力企业实现测量数字化 近日,量具量仪三大品牌哈量、广陆、英示的三位重磅嘉宾及震坤行磨具量具产线总经理,走进震坤行工业超市直播间。带来了一场“聚焦量具量仪市场,助力企业实现测量数字…

C语言中结构体(struct)的详细分解与使用

目录 第一:结构体的定义 第二:规则 第三:结构体声明 第四:C 语言结构体定义的三种方式 第五:对于结构体变量的初始化 第六:整体与分开 第七:结构体长度 第八:嵌入式开发中&am…

第 三 章 UML 类图

文章目录 前言一、依赖关系(虚线箭头)二、泛化关系:继承(实线空心箭头)三、实现关系(虚线空心箭头)四、关联关系(一对一为实线箭头,一对多为实线)五、聚合关系…

如何实现24小时客户服务

许多企业都有着这样的愿望:在不增加客服人员的同时能实现24小时客户服务。 那么有没有什么方法可以实现这一想法呢?在想解决方案之前我们可以先来谈谈客服的作用。 客服的作用主要为以下2点: 帮助用户更快地了解产品(减轻产品的…

Linux常用基础指令大全

在使用Aistudio平台学习PaddlePaddle时,常常会用到linux指令,对于之前没有学习过linux指令的我来说,确实有点难度,在学习了一段时间之后,慢慢也适应了linux指令,这一篇博客主要记录linux中的常用指令。以AI…

typescipt的运行环境搭建

1.安装node 官网地址:https://nodejs.org/en 2.安装完成后,运行node -v 检测安装版本 3.全局安装typescipt npm i typescipt -g 用tsc检测是否安装好 创建一个demo.ts文件 在终端运行tsc demo.ts会出现错误 找到windows powershell以管理员身份运行…

算法训练day2:哈希表

哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据&#…

LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 hash是什么,哈希表为什么叫哈希表? 一、🌱454. 四数…