【Python】学生管理系统

文章目录

  • [1. 需求说明](#1. 需求说明)
  • [2. 创建入口函数](#2. 创建入口函数)
  • [3. 实现菜单函数](#3. 实现菜单函数)
  • [4. 实现增删查改操作](#4. 实现增删查改操作)
    • [4.1 新增学生](#4.1 新增学生)
    • [4.2 显示学生](#4.2 显示学生)
    • [4.3 查找学生](#4.3 查找学生)
    • [4.4 删除学生](#4.4 删除学生)
    • [4.5 修改学生](#4.5 修改学生)
  • [5. 加入存档读档](#5. 加入存档读档)
    • [5.1 约定存档格式](#5.1 约定存档格式)
    • [5.2 实现存档函数](#5.2 实现存档函数)
    • [5.3 实现读档函数](#5.3 实现读档函数)
  • [6. 完整代码实现](#6. 完整代码实现)
  • [7. 打包成 exe 程序发布](#7. 打包成 exe 程序发布)
    • [7.1 安装 pyinstaller](#7.1 安装 pyinstaller)
    • [7.2. 打包程序](#7.2. 打包程序)

1. 需求说明

实现一个命令行版本的学生管理系统,支持学生信息的增、删、查、改以及本地文件持久化存储。

主要功能:

  • 新增学生:输入学号、姓名、性别、班级,自动查重。
  • 显示学生:列表化整齐展示所有学生信息。
  • 查找学生:根据姓名搜索匹配的学生记录。
  • 删除学生:根据学号精准删除学生记录。
  • 修改学生:根据学号定位并更新学生信息。
  • 存档读档:程序启动自动读档,数据变动自动存档。

2. 创建入口函数

设计要点:

  • 初始化全局列表 students
  • 程序启动时立即调用 load() 函数加载本地数据。
  • 循环调用 menu() 并根据返回值执行对应功能模块。

代码如下:

python 复制代码
import sys
import os

# 存储所有学生信息的全局列表
students = []

def main():
    """
    程序的入口函数
    """
    # 1. 启动时加载存档
    load()
    
    print('+---------------------------+')
    print('|   欢迎使用学生管理系统!     |')
    print('+---------------------------+')
    
    while True:
        choice = menu()
        if choice == 0:
            print("退出程序,欢迎下次使用!")
            sys.exit()
        elif choice == 1:
            insert()
        elif choice == 2:
            show()
        elif choice == 3:
            find()
        elif choice == 4:
            delete()
        elif choice == 5:
            update()
        else:
            print('您的输入有误! 请重新输入!')

if __name__ == '__main__':
    main()

3. 实现菜单函数

增加了对非数字输入的处理,防止程序因 int() 转换失败而崩溃。

代码如下:

python 复制代码
def menu():
    """
    显示程序菜单并获取用户输入
    """
    print("\n" + "-"*30)
    print(" 1. 新增学生信息")
    print(" 2. 显示所有同学信息")
    print(" 3. 根据名字查找学生信息")
    print(" 4. 删除学生信息")
    print(" 5. 修改学生信息")
    print(" 0. 退出程序")
    print("-"*30)
    
    choice = input(" 请输入您的选择: ").strip()
    if not choice.isdigit():
        return -1
    return int(choice)

4. 实现增删查改操作

4.1 新增学生

增加了学号重复检查,避免逻辑冲突。

代码如下:

python 复制代码
def insert():
    print("[新增学生] 开始!")
    studentId = input("请输入学生的学号: ").strip()
    
    # 检查学号是否重复
    for s in students:
        if s['studentId'] == studentId:
            print("学号已存在! 新增失败!")
            return

    name = input("请输入学生的姓名: ")
    gender = input("请输入学生的性别 (男/女): ")
    if gender not in ('男', '女'):
        print("性别不符合要求! 新增失败!")
        return
    className = input("请输入学生的班级: ")

    student = {
        'studentId': studentId,
        'name': name,
        'gender': gender,
        'className': className
    }
    students.append(student)
    save()
    print("[新增学生] 完毕!")

4.2 显示学生

使用格式化字符串保证列对齐。

代码如下:

python 复制代码
def show():
    print(f"[显示学生] 共有 {len(students)} 条记录")
    # 使用格式化对齐
    print(f"{'学号':<10}\t{'姓名':<10}\t{'性别':<5}\t{'班级':<10}")
    for s in students:
        print(f"{s['studentId']:<10}\t{s['name']:<10}\t{s['gender']:<5}\t{s['className']:<10}")

4.3 查找学生

代码如下:

python 复制代码
def find():
    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"[查找完成] 共找到 {count} 条记录!")

4.4 删除学生

采用列表推导式删除,避免遍历时直接删除导致的索引问题。

代码如下:

python 复制代码
def delete():
    global students
    studentId = input("请输入要删除的同学学号: ")
    original_len = len(students)
    
    # 重新构建列表,过滤掉目标学号
    students = [s for s in students if s['studentId'] != studentId]
    
    if len(students) < original_len:
        save()
        print(f"学号为 {studentId} 的同学信息已删除!")
    else:
        print("未找到该学号的学生!")

4.5 修改学生

代码如下:

python 复制代码
def update():
    studentId = input("请输入要修改的同学学号: ")
    for s in students:
        if s['studentId'] == studentId:
            print(f"找到学生 [{s['name']}],请输入新信息 (回车表示不修改该项)")
            
            new_name = input(f"姓名 ({s['name']}): ").strip()
            if new_name: s['name'] = new_name
            
            new_gender = input(f"性别 ({s['gender']}): ").strip()
            if new_gender in ('男', '女'): s['gender'] = new_gender
            
            new_class = input(f"班级 ({s['className']}): ").strip()
            if new_class: s['className'] = new_class
            
            save()
            print("修改成功!")
            return
    print("未找到该学号的学生!")

5. 加入存档读档

5.1 约定存档格式

存档文件约定保存在当前目录下的 record.txt

  • 编码方式:UTF-8。
  • 分隔方式 :每行一个学生信息,字段间使用 \t 分隔。

5.2 实现存档函数

代码如下:

python 复制代码
def save():
    """
    将全局列表 students 写入文件
    """
    try:
        with open('record.txt', 'w', encoding='utf-8') as f:
            for s in students:
                f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
    except Exception as e:
        print(f"存档失败: {e}")

5.3 实现读档函数

代码如下:

python 复制代码
def load():
    """
    从文件加载数据到全局列表 students
    """
    if not os.path.exists('record.txt'):
        return
    
    global students
    students = []
    try:
        with open('record.txt', 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if not line: continue
                tokens = line.split('\t')
                if len(tokens) == 4:
                    student = {
                        'studentId': tokens[0],
                        'name': tokens[1],
                        'gender': tokens[2],
                        'className': tokens[3]
                    }
                    students.append(student)
        print(f"[读档成功] 已加载 {len(students)} 条历史记录!")
    except Exception as e:
        print(f"读档失败: {e}")

6. 完整代码实现

代码如下:

python 复制代码
import sys
import os

# ==========================================
# 2.1 全局配置与入口
# ==========================================
students = []  # 存储学生信息的全局列表

def main():
    """
    程序的入口函数:初始化并控制主循环
    """
    load()  # 启动时先读档
    
    print('+---------------------------+')
    print('|   欢迎使用学生管理系统!     |')
    print('+---------------------------+')
    
    while True:
        choice = menu()
        if choice == 0:
            print("感谢使用,再见!")
            sys.exit()
        elif choice == 1:
            insert()
        elif choice == 2:
            show()
        elif choice == 3:
            find()
        elif choice == 4:
            delete()
        elif choice == 5:
            update()
        else:
            print('您的输入有误! 请重新输入!')

# ==========================================
# 3. 菜单功能
# ==========================================
def menu():
    """
    显示菜单并捕获用户输入
    """
    print("\n" + "="*30)
    print(" 1. 新增学生信息")
    print(" 2. 显示所有同学信息")
    print(" 3. 根据名字查找学生信息")
    print(" 4. 删除学生信息")
    print(" 5. 修改学生信息")
    print(" 0. 退出程序")
    print("="*30)
    
    choice = input(" 请输入您的选择: ").strip()
    if not choice.isdigit():
        return -1
    return int(choice)

# ==========================================
# 4. 核心业务逻辑
# ==========================================

def insert():
    """新增学生"""
    print("\n[新增学生] 开始")
    sid = input("请输入学号: ").strip()
    
    for s in students:
        if s['studentId'] == sid:
            print("错误:该学号已存在!")
            return

    name = input("请输入姓名: ").strip()
    gender = input("请输入性别 (男/女): ").strip()
    if gender not in ('男', '女'):
        print("错误:性别不符合要求!")
        return
    className = input("请输入班级: ").strip()

    students.append({
        'studentId': sid,
        'name': name,
        'gender': gender,
        'className': className
    })
    save()
    print("[新增学生] 完毕!")

def show():
    """显示所有学生"""
    if not students:
        print("\n[提示] 目前没有学生记录。")
        return
    
    print(f"\n[显示学生] 共 {len(students)} 条记录")
    print(f"{'学号':<10}\t{'姓名':<10}\t{'性别':<5}\t{'班级':<10}")
    for s in students:
        print(f"{s['studentId']:<10}\t{s['name']:<10}\t{s['gender']:<5}\t{s['className']:<10}")

def find():
    """查找学生"""
    name = input("\n请输入要查找的姓名: ").strip()
    found = False
    for s in students:
        if name == s['name']:
            print(f"找到记录: [{s['studentId']}] {s['name']} | {s['gender']} | {s['className']}")
            found = True
    if not found:
        print(f"未找到名为 [{name}] 的学生。")

def delete():
    """删除学生"""
    global students
    sid = input("\n请输入要删除的学号: ").strip()
    original_len = len(students)
    students = [s for s in students if s['studentId'] != sid]
    
    if len(students) < original_len:
        save()
        print(f"学号为 [{sid}] 的学生已成功删除。")
    else:
        print("未找到该学号,操作取消。")

def update():
    """修改学生 (新增逻辑)"""
    sid = input("\n请输入要修改的学生学号: ").strip()
    for s in students:
        if s['studentId'] == sid:
            print(f"已找到 [{s['name']}],请输入新信息 (回车跳过不修改):")
            
            new_name = input(f"新姓名 ({s['name']}): ").strip()
            if new_name: s['name'] = new_name
            
            new_gender = input(f"新性别 ({s['gender']}): ").strip()
            if new_gender in ('男', '女'): s['gender'] = new_gender
            
            new_class = input(f"新班级 ({s['className']}): ").strip()
            if new_class: s['className'] = new_class
            
            save()
            print("信息更新成功!")
            return
    print("未找到该学号的学生。")

# ==========================================
# 5. 持久化存储 (存档读档)
# ==========================================

def save():
    """将数据写入本地 record.txt"""
    try:
        with open('record.txt', 'w', encoding='utf-8') as f:
            for s in students:
                f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
    except Exception as e:
        print(f"存储出错: {e}")

def load():
    """从本地 record.txt 读取数据"""
    if not os.path.exists('record.txt'):
        return
    
    global students
    students = []
    try:
        with open('record.txt', 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if not line: continue
                tokens = line.split('\t')
                if len(tokens) == 4:
                    students.append({
                        'studentId': tokens[0],
                        'name': tokens[1],
                        'gender': tokens[2],
                        'className': tokens[3]
                    })
        print(f"[读档成功] 加载了 {len(students)} 条记录")
    except Exception as e:
        print(f"读档出错: {e}")

if __name__ == '__main__':
    main()

7. 打包成 exe 程序发布

当前虽然已经实现了一个管理系统,但是 .py 的文件只能在安装了 Python 环境的机器上运行。

为了能够更好的部署到其他主机上,可以借助 pyinstaller 来把 Python 程序打包成 exe 程序。

7.1 安装 pyinstaller

在终端执行:

bash 复制代码
pip install pyinstaller

由于官方源在国外,国内访问有时会断断续续。你可以通过 -i 参数切换到清华大学或阿里云的镜像源,速度会快很多。

python 复制代码
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

运行结果如下:

7.2. 打包程序

其中 -F 表示打包成单个 exe(不带动态库)

在终端输入:

bash 复制代码
pyinstaller -F test.py

注意:如果提示找不到 pyinstaller 命令,则需要重启一下 PyCharm。

稍等片刻,很快打包完成。

此时就可以把这个程序拷贝给其他机器使用了,无需 Python 环境即可运行。

如下所示:

相关推荐
love530love4 小时前
【ComfyUI】解决 ModuleNotFoundError: No module named ‘inference_core_nodes‘ 问题
人工智能·windows·python·comfyui·inference-core
宇木灵4 小时前
C语言基础-十、文件操作
c语言·开发语言·学习
heimeiyingwang5 小时前
企业供应链 AI 优化:需求预测与智能调度
大数据·数据库·人工智能·机器学习
云泽8085 小时前
C++ 多态入门:虚函数、重写、虚析构及 override/final 实战指南(附腾讯面试题)
开发语言·c++
亚亚的学习和分享5 小时前
python基础语法----条件语句
python
yanghuashuiyue6 小时前
lambda+sealed+record
java·开发语言
山岚的运维笔记6 小时前
SQL Server笔记 -- 第73章:排序/对行进行排序
数据库·笔记·后端·sql·microsoft·sqlserver
XLYcmy6 小时前
智能体大赛 目录
数据库·ai·llm·prompt·agent·检索·万方
盟接之桥6 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造