Python--学生管理系统

49 阅读6分钟

学生管理系统功能清单

  1. 添加学生信息(学号、姓名、年龄、性别、成绩)
  2. 删除学生(按学号)
  3. 修改学生信息(按学号)
  4. 查询学生信息(按学号 / 姓名)
  5. 显示所有学生信息
  6. 保存数据到文件(txt 格式)
  7. 加载文件中的学生数据
  8. 退出系统

完整代码实现

python

运行

import os

# 全局变量:存储学生信息的列表(每个元素是字典)
student_list = []
# 数据文件路径
DATA_FILE = "students.txt"

def print_menu():
    """打印系统菜单"""
    print("=" * 30)
    print("    学生管理系统 V1.0")
    print(" 1. 添加学生信息")
    print(" 2. 删除学生信息")
    print(" 3. 修改学生信息")
    print(" 4. 查询学生信息")
    print(" 5. 显示所有学生信息")
    print(" 6. 保存数据到文件")
    print(" 7. 从文件加载数据")
    print(" 0. 退出系统")
    print("=" * 30)

def add_student():
    """添加学生信息"""
    print("\n----- 添加学生 -----")
    # 输入学号(确保唯一)
    while True:
        student_id = input("请输入学生学号(数字):").strip()
        if not student_id.isdigit():
            print("学号必须是数字!请重新输入。")
            continue
        # 检查学号是否已存在
        exists = any(student["id"] == student_id for student in student_list)
        if exists:
            print(f"学号 {student_id} 已存在!请重新输入。")
        else:
            break
    # 输入其他信息
    name = input("请输入学生姓名:").strip()
    while True:
        age = input("请输入学生年龄(数字):").strip()
        if age.isdigit() and 0 < int(age) < 100:
            age = int(age)
            break
        print("年龄必须是0-100的数字!请重新输入。")
    gender = input("请输入学生性别(男/女):").strip()
    while True:
        score = input("请输入学生成绩(0-100):").strip()
        if score.replace(".", "", 1).isdigit():
            score = float(score)
            if 0 <= score <= 100:
                break
        print("成绩必须是0-100的数字!请重新输入。")
    # 构造学生字典并添加到列表
    student = {
        "id": student_id,
        "name": name,
        "age": age,
        "gender": gender,
        "score": score
    }
    student_list.append(student)
    print(f"✅ 学生 {name}(学号:{student_id})添加成功!")

def delete_student():
    """删除学生信息(按学号)"""
    print("\n----- 删除学生 -----")
    if not student_list:
        print("❌ 暂无学生数据,无法删除!")
        return
    student_id = input("请输入要删除的学生学号:").strip()
    # 查找并删除学生
    for i, student in enumerate(student_list):
        if student["id"] == student_id:
            del student_list[i]
            print(f"✅ 学号 {student_id} 的学生已成功删除!")
            return
    print(f"❌ 未找到学号 {student_id} 的学生!")

def modify_student():
    """修改学生信息(按学号)"""
    print("\n----- 修改学生 -----")
    if not student_list:
        print("❌ 暂无学生数据,无法修改!")
        return
    student_id = input("请输入要修改的学生学号:").strip()
    # 查找学生
    for student in student_list:
        if student["id"] == student_id:
            print(f"当前信息:{student}")
            # 逐项修改(按回车保留原信息)
            name = input(f"请输入新姓名(原:{student['name']}):").strip()
            if name:
                student["name"] = name
            # 年龄修改
            while True:
                age = input(f"请输入新年龄(原:{student['age']}):").strip()
                if not age:  # 回车保留原数据
                    break
                if age.isdigit() and 0 < int(age) < 100:
                    student["age"] = int(age)
                    break
                print("年龄必须是0-100的数字!请重新输入(回车保留原数据)。")
            # 性别修改
            gender = input(f"请输入新性别(原:{student['gender']}):").strip()
            if gender:
                student["gender"] = gender
            # 成绩修改
            while True:
                score = input(f"请输入新成绩(原:{student['score']}):").strip()
                if not score:  # 回车保留原数据
                    break
                if score.replace(".", "", 1).isdigit():
                    score = float(score)
                    if 0 <= score <= 100:
                        student["score"] = score
                        break
                print("成绩必须是0-100的数字!请重新输入(回车保留原数据)。")
            print(f"✅ 学号 {student_id} 的学生信息修改成功!")
            return
    print(f"❌ 未找到学号 {student_id} 的学生!")

def query_student():
    """查询学生信息(按学号/姓名)"""
    print("\n----- 查询学生 -----")
    if not student_list:
        print("❌ 暂无学生数据,无法查询!")
        return
    query_type = input("请选择查询方式(1-按学号,2-按姓名):").strip()
    if query_type == "1":
        student_id = input("请输入要查询的学号:").strip()
        for student in student_list:
            if student["id"] == student_id:
                print("✅ 查询结果:")
                print(f"学号:{student['id']},姓名:{student['name']},年龄:{student['age']},性别:{student['gender']},成绩:{student['score']}")
                return
        print(f"❌ 未找到学号 {student_id} 的学生!")
    elif query_type == "2":
        name = input("请输入要查询的姓名:").strip()
        results = [s for s in student_list if s["name"] == name]
        if results:
            print(f"✅ 共找到 {len(results)} 个名为 {name} 的学生:")
            for student in results:
                print(f"学号:{student['id']},姓名:{student['name']},年龄:{student['age']},性别:{student['gender']},成绩:{student['score']}")
        else:
            print(f"❌ 未找到姓名为 {name} 的学生!")
    else:
        print("❌ 无效的查询方式!")

def show_all_students():
    """显示所有学生信息"""
    print("\n----- 所有学生信息 -----")
    if not student_list:
        print("❌ 暂无学生数据!")
        return
    # 格式化打印表头
    print(f"{'学号':<8}{'姓名':<8}{'年龄':<8}{'性别':<8}{'成绩':<8}")
    print("-" * 40)
    # 打印每个学生信息
    for student in student_list:
        print(f"{student['id']:<8}{student['name']:<8}{student['age']:<8}{student['gender']:<8}{student['score']:<8.1f}")

def save_to_file():
    """保存学生数据到文件"""
    if not student_list:
        print("❌ 暂无学生数据,无需保存!")
        return
    try:
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            for student in student_list:
                # 按格式写入:学号|姓名|年龄|性别|成绩
                line = f"{student['id']}|{student['name']}|{student['age']}|{student['gender']}|{student['score']}\n"
                f.write(line)
        print(f"✅ 数据已成功保存到 {DATA_FILE}!")
    except Exception as e:
        print(f"❌ 保存失败:{e}")

def load_from_file():
    """从文件加载学生数据"""
    if not os.path.exists(DATA_FILE):
        print(f"❌ {DATA_FILE} 文件不存在!")
        return
    try:
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            lines = f.readlines()
        # 清空原有数据
        student_list.clear()
        for line in lines:
            line = line.strip()
            if not line:
                continue
            # 拆分数据并转换类型
            parts = line.split("|")
            if len(parts) != 5:
                print(f"⚠️ 跳过无效行:{line}")
                continue
            student_id, name, age, gender, score = parts
            # 类型转换
            try:
                age = int(age)
                score = float(score)
            except ValueError:
                print(f"⚠️ 数据类型错误,跳过行:{line}")
                continue
            # 添加到列表
            student_list.append({
                "id": student_id,
                "name": name,
                "age": age,
                "gender": gender,
                "score": score
            })
        print(f"✅ 成功从 {DATA_FILE} 加载 {len(student_list)} 条学生数据!")
    except Exception as e:
        print(f"❌ 加载失败:{e}")

def main():
    """系统主函数"""
    print("欢迎使用学生管理系统!")
    while True:
        print_menu()
        choice = input("请输入操作编号(0-7):").strip()
        print()  # 空行分隔,提升可读性
        if choice == "0":
            print("👋 感谢使用学生管理系统,再见!")
            break
        elif choice == "1":
            add_student()
        elif choice == "2":
            delete_student()
        elif choice == "3":
            modify_student()
        elif choice == "4":
            query_student()
        elif choice == "5":
            show_all_students()
        elif choice == "6":
            save_to_file()
        elif choice == "7":
            load_from_file()
        else:
            print("❌ 无效的操作编号!请输入0-7之间的数字。")
        input("\n按回车键继续...")  # 暂停,等待用户确认
        os.system("cls" if os.name == "nt" else "clear")  # 清屏(跨平台)

if __name__ == "__main__":
    main()

系统使用说明

1. 运行方式

将代码保存为student_management.py,直接运行即可(Python 3.x 环境):

bash

运行

python student_management.py

2. 核心功能操作

  • 添加学生:输入唯一学号(数字),依次填写姓名、年龄、性别、成绩(有输入校验,避免非法数据);
  • 删除 / 修改 / 查询:按学号精准操作,查询支持 “学号 / 姓名” 两种方式;
  • 数据保存 / 加载:自动将数据保存到students.txt文件(格式:学号|姓名|年龄|性别|成绩),重启系统后可加载;
  • 清屏功能:每次操作后按回车,自动清屏并重新显示菜单,交互更整洁。

3. 数据校验亮点

  • 学号:强制数字 + 唯一性检查;
  • 年龄:0-100 的数字;
  • 成绩:0-100 的数字(支持小数);
  • 所有输入支持 “回车保留原数据”(修改功能)。

扩展建议

  1. 数据持久化优化:改用 JSON/CSV 格式存储,可读性更强(替换save_to_fileload_from_file即可);
  2. 增加功能:如按成绩排序、统计平均分 / 最高分、批量导入导出等;
  3. 界面优化:结合tkinter制作图形化界面(GUI),提升交互体验;
  4. 权限管理:添加登录功能,区分管理员 / 普通用户权限;
  5. 异常处理增强:增加更多边界情况校验(如空姓名、特殊字符等)。