Python实现班级档案管理系统实战指南

巷口听风
巷口听风
发布时间:2026-10-12 | 1人浏览过
原创

本文详细介绍如何利用Python编写一个班级档案管理系统。系统涵盖学生基本信息的录入、增删改查、终端交互菜单设计,并结合OpenPyXL库实现数据向Excel文件的持久化存储。附带逻辑修复与优化后的完整源代码,便于开发者直接部署与二次扩展。

功能设计与架构思路

该系统的核心目标是构建一个轻量级的命令行界面(CLI),用于集中管理班级学生的档案数据。为了满足日常教务或学习场景的需求,系统需具备以下关键特性:

  • 数据模型:以字典列表为内存载体,每条记录包含学号、姓名、性别、年龄及备注字段。学号作为唯一标识键,需在前端录入环节进行重复性拦截。
  • 身份校验:内置简易登录验证机制,通过比对账号格式与预设密码规则(学号后五位),保障系统入口安全。
  • 核心业务:覆盖全生命周期的数据维护,包括新建档案、检索过滤、字段级动态修改、单条记录剔除,以及基于 openpyxl 的 Excel 导出功能。
  • 交互闭环:通过主循环绑定数字按键映射至具体函数,实现不间断的业务流转与异常选项容错。

运行环境准备

本项目完全基于标准 Python 生态开发,仅需安装第三方电子表格处理库即可满足文件导出需求。请在终端执行以下命令完成依赖部署:

pip install openpyxl

建议运行环境为 Python 3.6 及以上版本,以确保字符串格式化特性的兼容性。

核心代码实现步骤

第1步:初始化全局容器与登录验证模块

首先定义全局列表 s_information 模拟数据库,并编写校验函数。原稿中登录逻辑存在 while True and condition 导致的死跳隐患,此处修正为标准条件轮询结构,确保输入非法账号或密码时自动重试。

第2步:完善信息录入与批量显示逻辑

录入模块需严格校验学号唯一性。原稿循环判断后未做状态阻断,导致重复添加。重构后采用布尔标记位,仅在未命中现有学号时才拼接新字典并追加至容器。显示模块则遍历容器打印当前快照。

第3步:构建精确查询与动态修改功能

查询与修改均支持通过学号或姓名定位目标记录。修改逻辑引入子菜单映射,允许用户针对特定索引覆盖对应字段值。删除操作增加非空校验,防止误删或触发索引越界。

第4步:调用OpenPyXL实现Excel文件持久化

摒弃易丢失数据的纯文本保存方式,改用 Workbook 对象创建新工作簿。自动填充首行列名,通过遍历将内存字典值逐行写入单元格,最后调用 save() 固化至磁盘。

第5步:组装主控循环与终端交互接口

将上述离散函数聚合至 main_loop() 中。使用 while True: 维持服务常驻,配合 input() 捕获指令并分发。清理原稿中遗留的“图书管理”误注释,统一语义为档案管理。

以下是整合所有逻辑并修复已知缺陷的完整可运行代码:

import openpyxl
from openpyxl import Workbook
import sys

# 全局数据存储容器
s_information = [
    {'学号':'202031108041','姓名':'小明','性别':'男','年龄':'20','备注':'优等生'},
    {'学号':'202031108042','姓名':'小谷','性别':'女','年龄':'20','备注':'特长生'},
    {'学号':'202031108043','姓名':'小啊','性别':'男','年龄':'21','备注':''},
]

def check_login():
    """身份校验模块:账号需大于5位,密码必须为账号后五位"""
    print("------ 系统登陆 ------")
    print("提示:账号为学号,密码为学号后五位")
    while True:
        key_word = input("账号:").strip()
        if len(key_word) < 5:
            print("账号长度不足,请重新输入")
            continue
        password = input("密码:").strip()
        if password == key_word[-5:]:
            print("登录成功,进入管理系统!")
            break
        print("密码错误,请核对后重试")

def show_menu():
    print('-' * 40)
    print('[1]: 学生基本信息录入')
    print('[2]: 学生基本信息显示')
    print('[3]: 学生基本信息保存')
    print('[4]: 学生基本信息删除')
    print('[5]: 学生基本信息修改')
    print('[6]: 学生基本信息查询')
    print('[7]: 退出系统')
    print('-' * 40)

def add_information():
    xuehao = input('请输入新学生的学号:').strip()
    is_duplicate = False
    for record in s_information:
        if record['学号'] == xuehao:
            is_duplicate = True
            break
    
    if is_duplicate:
        print("错误:该学号已存在于系统中,请勿重复录入。")
        return
        
    new_record = {
        '学号': xuehao,
        '姓名': input('请输入姓名:').strip(),
        '性别': input('请输入性别:').strip(),
        '年龄': input('请输入年龄:').strip(),
        '备注': input('请输入备注:').strip()
    }
    s_information.append(new_record)
    print("录入成功!")

def show_information():
    if not s_information:
        print("当前暂无学生数据。")
        return
    for idx, record in enumerate(s_information, start=1):
        print(f"[{idx}] {record}")

def delete_information():
    target_name = input('请输入要删除的学生姓名:').strip()
    original_len = len(s_information)
    s_information[:] = [rec for rec in s_information if rec['姓名'] != target_name]
    
    if len(s_information) == original_len:
        print("未找到名为 '{}' 的学生记录,删除失败。".format(target_name))
    else:
        print("已成功移除对应记录。")

def modify_information():
    search_key = input('请输入学号或姓名进行定位:').strip()
    target_idx = None
    
    for idx, record in enumerate(s_information):
        if record['姓名'] == search_key or record['学号'] == search_key:
            target_idx = idx
            break
            
    if target_idx is None:
        print("查无此人,请核对输入的学号或姓名。")
        return
        
    print("--- 请选择要修改的字段 ---")
    print("1. 学号\t2. 姓名\t3. 性别\t4. 年龄\t5. 备注")
    field_choice = input("输入选项数字:").strip()
    fields_map = {'1':'学号', '2':'姓名', '3':'性别', '4':'年龄', '5':'备注'}
    
    if field_choice not in fields_map:
        print("无效选项,修改已取消。")
        return
        
    current_value = s_information[target_idx][fields_map[field_choice]]
    s_information[target_idx][fields_map[field_choice]] = input(f"请输入新值 (原值:{current_value}): ").strip()
    print("字段更新完毕。")

def search_information():
    query_val = input('请输入学号或姓名进行查询:').strip()
    found_records = [r for r in s_information if query_val in r.values()]
    
    if found_records:
        for r in found_records:
            print(r)
    else:
        print("未匹配到相关数据。")

def save_to_excel():
    file_name = input('请输入保存的文件名 (无需后缀):').strip()
    if not file_name:
        print("文件名不能为空,保存已取消。")
        return
        
    wb = Workbook()
    sheet = wb.active
    sheet.title = "学生信息表"
    
    headers = ['学号', '姓名', '性别', '年龄', '备注']
    sheet.append(headers)
    
    for record in s_information:
        row_data = list(record.values())
        sheet.append(row_data)
        
    wb.save(f"{file_name}.xlsx")
    print(f"数据已成功导出至 {file_name}.xlsx")

def main_loop():
    check_login()
    
    while True:
        show_menu()
        choice = input("请选择功能编号:").strip()
        
        dispatch = {
            '1': add_information,
            '2': show_information,
            '3': save_to_excel,
            '4': delete_information,
            '5': modify_information,
            '6': search_information,
            '7': lambda: sys.exit(0)
        }
        
        func = dispatch.get(choice)
        if func:
            func()
        else:
            print("输入有误,请返回主菜单重新选择。")

if __name__ == '__main__':
    main_loop()

代码测试与避坑指南

运行脚本后,控制台会优先拦截未通过身份验证的请求。登录成功后,主循环将永久驻留直至手动输入 7 退出系统。测试时可重点关注以下边界情况:

  • 学号防重:尝试录入已存在的学号,系统将抛出拦截提示且不改变内存状态。
  • 精准删除与修改:若输入不存在的姓名,系统会明确反馈并放弃后续操作,避免静默失败。
  • 文件导出路径:生成的 .xlsx 默认位于 Python 解释器当前工作目录下,可在资源管理器中直接双击预览核对数据矩阵。

总结

本方案通过模块化拆分,将复杂的数据流管控收敛于简洁的控制台交互中。利用 Python 原生数据结构与轻量级 Excel 库的配合,能够以极低的代码成本达成企业级档案管理的雏形需求。开发者可根据实际业务场景,进一步接入 SQLite 数据库或 Web 前端框架进行平滑升级。以上就是利用Python开发班级档案管理系统的具体代码,更多关于Python实战项目的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表