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

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

思路

创建一个全局的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()
  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值