零基础小白构建 Python 学生管理系统:从 “完全不懂” 到 “可运行项目” 的 万字全程指南

编程达人挑战赛·第6期 10w+人浏览 191人参与

面向人群:刚学完 Python 基础语法的零基础小白;核心目标:学会 “做项目的思考逻辑”,而非仅复制代码;项目载体:学生管理系统 —— 学校老师用来记录 / 查询 / 修改 / 删除学生信息的工具)


【前置认知篇】:先搞懂 “什么是项目”

0.1 为什么要学 “做项目”?

你可能刚学完 Python 的变量、循环、条件判断,觉得 “我会写代码了,但不知道写什么”——项目就是把零散的语法 “串起来” 解决实际问题的东西。比如你想帮班级老师整理学生的学号、姓名、成绩,不用 Excel 手动输,用 Python 写个 “小工具” 自动做,这就是 “学生管理系统” 项目。

0.2 什么是 “学生管理系统”?

  • 本质:一个 “自动化的学生信息收纳盒”
  • 功能:老师打开工具→输入 “1” 添加学生→输入 “2” 删除学生→输入 “3” 查询学生→输入 “4” 修改成绩→输入 “5” 退出,所有信息关电脑后还在(不会丢失)
  • 为什么不用 Excel?:Excel 是现成的,但写代码做系统能让你理解 “工具的底层逻辑”—— 比如 Excel 的 “保存” 功能是怎么实现的?其实就是把数据写到电脑文件里,和我们的系统原理一样。

0.3 零基础做项目的 “三个核心原则”

原则 1:先 “能用” 再 “好看”
  • 错误做法:刚开始就想做 “带彩色界面、能联网的系统”
  • 正确做法:先做 “只打印文字、能存到本地文件” 的最基础版本,再慢慢加功能
原则 2:拆成 “小积木” 再拼
  • 错误做法:把所有代码堆在一个大文件里
  • 正确做法:把系统分成 “显示菜单”“添加学生”“保存数据” 等小模块,每个模块只做一件事
原则 3:每写一行都问 “为什么”
  • 错误做法:复制别人的代码,不管含义
  • 正确做法:每写一个变量、一个函数,都要想 “我为什么要用它?”“它能解决什么问题?”

0.4 Python 环境准备(给真・零基础的你)

步骤 1:下载 Python
  • 去 Python 官网(https://www.python.org/)下载最新版本
  • 安装时一定要勾选 “Add Python to PATH”(否则 cmd 找不到 Python 命令),然后点击 “Install Now”
步骤 2:验证安装
  • Win+R打开 “运行”,输入cmd,按回车
  • 输入python --version,如果出现 “Python 3.x.x”(比如 3.12.4),说明安装成功
步骤 3:安装 IDE(可选,但推荐)
  • PyCharm Community Edition(免费版),下载地址:https://www.jetbrains.com/pycharm/download/
  • 打开 PyCharm 后,选择 “New Project”,设置项目目录(比如E:\StudentManagement),点击 “Create”

【思路拆解篇】:从 “需求” 到 “代码框架” 的完整思考过程

1.1 第一步:明确 “可实现的需求”

(什么是 “可实现的需求”?就是 “不用复杂技术、只用 Python 基础语法就能做的事”,不要想 “能刷脸登录” 这种不可能的功能)

我给小白定制的 “学生管理系统核心需求清单”(必须全部能实现):
功能编号功能名称具体要求
1显示菜单打印 “1. 添加学生 2. 删除学生 3. 查询学生 4. 修改成绩 5. 保存数据 6. 退出系统”
2添加学生输入学号、姓名、班级、数学成绩、语文成绩,学号必须唯一(不能重复)
3删除学生输入学号,删除对应的学生信息
4查询学生输入学号或姓名,查询对应的学生信息(支持 “模糊查询”,比如输入 “张” 能找到所有姓张的学生)
5修改成绩输入学号,修改数学或语文成绩
6保存数据把所有学生信息保存到电脑文件里,关电脑后再打开系统,数据还在
7退出系统退出前自动保存数据

1.2 第二步:划分 “功能模块”

(什么是 “功能模块”?就是把 “大需求” 拆成 “小功能块”,每个块只做一件事 —— 比如 “显示菜单” 是一个模块,“保存数据” 是另一个模块)

学生管理系统的 4 个核心模块(零基础必须掌握的划分逻辑):
模块名称模块作用技术点
UI 模块(User Interface,用户界面)负责和用户交互:显示菜单、获取用户输入print()input()try-except(处理用户输入错误)
Core 模块(核心功能)负责核心业务逻辑:增删改查学生信息列表、字典、循环、条件判断、函数
DB 模块(Data Base,数据存储)负责把数据保存到文件 / 从文件读取open()json模块(Python 自带,用于格式化保存数据)
Main 模块(主程序入口)负责把所有模块串起来运行循环、函数调用

1.3 第三步:设计 “数据结构”

(什么是 “数据结构”?就是 “用什么方式存学生信息”—— 比如用 “变量”“列表”“字典”?)

零基础的 “最优数据结构选择”:列表嵌套字典
  • 为什么用列表?:列表可以存 “多个学生的信息”(比如students = [学生1, 学生2, 学生3]
  • 为什么用字典?:每个学生有 “学号、姓名、班级、成绩” 多个属性,字典可以用 “键(比如"学号")” 对应 “值(比如"2024052001")”,比用列表的索引(比如学生1[0])更清晰,不容易搞混
  • 示例结构:
    # 一个学生的信息(字典)
    student = {
        "学号": "2024052001",
        "姓名": "张三",
        "班级": "一年级一班",
        "数学成绩": 95,
        "语文成绩": 90
    }
    # 所有学生的信息(列表嵌套字典)
    students = [
        {"学号": "2024052001", "姓名": "张三", "班级": "一年级一班", "数学成绩": 95, "语文成绩": 90},
        {"学号": "2024052002", "姓名": "李四", "班级": "一年级二班", "数学成绩": 85, "语文成绩": 80}
    ]
    
为什么不用 “Excel” 或 “数据库”?
  • 零基础不会操作 Excel 的openpyxl库或数据库的sqlite3
  • json 文件保存数据(Python 自带json模块),语法简单,适合小白

1.4 第四步:设计 “运行流程”

(什么是 “运行流程”?就是系统从 “打开” 到 “退出” 的完整步骤,用 “文字流程图” 表示)

1. 打开系统(运行main.py文件)
2. 自动从json文件读取已保存的学生信息到列表
3. 打印菜单(UI模块)
4. 用户输入选择(比如输入1-6)
5. 根据选择调用对应的功能模块:
   - 输入1:调用Core模块的“添加学生”功能
   - 输入2:调用Core模块的“删除学生”功能
   - 输入3:调用Core模块的“查询学生”功能
   - 输入4:调用Core模块的“修改成绩”功能
   - 输入5:调用DB模块的“保存数据”功能
6. 重复步骤3-5,直到用户输入6(退出系统)
7. 退出前自动调用DB模块的“保存数据”功能,确保数据不丢失

1.5 第五步:技术选型确认

(什么是 “技术选型”?就是 “用什么 Python 语法 / 模块来实现每个功能”,零基础只选自带的、不需要安装的模块

功能技术选型原因
菜单显示print()input()Python 自带,语法简单
用户输入错误处理try-except防止用户输入非数字或无效选项(比如输入 “abc” 代替 “1”)
学生信息存储列表 + 字典Python 基础数据结构,不需要额外安装
数据持久化json模块Python 自带,用于把列表转成文本保存到文件,可读性强
文件操作open()函数Python 自带,用于读写文件

【代码实现篇】:从 “模块” 到 “完整系统” 的逐行详解

2.0 先创建 “项目目录结构”

(按模块创建不同的.py 文件,不要把所有代码堆在一个文件里 —— 这是 “模块化编程” 的基础)

StudentManagement/  # 项目根目录
├── ui.py          # UI模块:显示菜单、获取用户输入
├── core.py        # Core模块:增删改查核心功能
├── db.py          # DB模块:数据存储(读写json文件)
└── main.py        # Main模块:主程序入口(串起所有模块)

2.1 实现【UI 模块】(ui.py):和用户交互的 “窗口”

(这个模块只做 “和用户说话” 的事:告诉用户有什么功能,让用户输入选择)

# ui.py:用户界面模块
# ------------ 功能1:打印菜单 ------------
def print_menu():
    """
    打印学生管理系统的主菜单
    为什么用函数?:因为菜单要重复打印,用函数可以避免重复写代码
    为什么加注释?:让别人(包括未来的自己)知道这个函数是做什么的
    """
    # 用分割线美化菜单(零基础可选,只是让菜单好看)
    print("=" * 40)  # 打印40个=,形成分割线
    print("       学生管理系统 V1.0")  # 系统标题
    print("1.  添加学生信息")  # 菜单选项1
    print("2.  删除学生信息")  # 菜单选项2
    print("3.  查询学生信息")  # 菜单选项3
    print("4.  修改学生成绩")  # 菜单选项4
    print("5.  手动保存数据")  # 菜单选项5
    print("6.  退出系统")       # 菜单选项6
    print("=" * 40)  # 结束分割线

# ------------ 功能2:获取用户的有效选择 ------------
def get_user_choice():
    """
    获取用户输入的1-6之间的数字选择
    为什么要做“有效选择”?:防止用户输入非数字(比如abc)或不在1-6的数字(比如7)
    """
    while True:  # 循环,直到用户输入有效选择为止
        try:
            # 获取用户输入的内容,并转成整数(因为input()默认返回字符串)
            choice = int(input("请输入您的选择(1-6):"))
            # 检查输入的数字是否在1-6之间
            if 1 <= choice <= 6:
                return choice  # 返回有效的选择
            else:
                print("输入错误!请输入1-6之间的数字!")  # 提示用户输入错误
        except ValueError:
            # 当用户输入非数字(比如abc)时,会触发ValueError异常
            print("输入错误!请输入数字!")  # 提示用户输入错误

# ------------ 功能3:获取学生的基本信息(用于添加学生) ------------
def get_student_info():
    """
    获取用户输入的学生信息:学号、姓名、班级、数学成绩、语文成绩
    为什么要单独写这个函数?:因为添加学生时需要多次获取用户输入,用函数可以简化代码
    """
    # 1. 获取学号:学号必须是字符串(防止前面的0丢失,比如“2024052001”如果是整数会变成2024052001,但实际是字符串)
    student_id = input("请输入学号:")
    # 2. 获取姓名:直接字符串
    name = input("请输入姓名:")
    # 3. 获取班级:直接字符串
    class_name = input("请输入班级:")
    # 4. 获取数学成绩:必须是整数或浮点数,用try-except处理
    while True:
        try:
            math_score = float(input("请输入数学成绩:"))
            break  # 输入有效,跳出循环
        except ValueError:
            print("数学成绩必须是数字!请重新输入!")
    # 5. 获取语文成绩:同样必须是数字
    while True:
        try:
            chinese_score = float(input("请输入语文成绩:"))
            break
        except ValueError:
            print("语文成绩必须是数字!请重新输入!")
    # 返回一个字典,包含所有学生信息
    return {
        "学号": student_id,
        "姓名": name,
        "班级": class_name,
        "数学成绩": math_score,
        "语文成绩": chinese_score
    }

# ------------ 功能4:获取要删除的学号 ------------
def get_delete_id():
    """获取用户要删除的学生学号"""
    return input("请输入要删除的学生学号:")

# ------------ 功能5:获取要查询的关键词(学号或姓名) ------------
def get_query_keyword():
    """获取用户要查询的学号或姓名关键词"""
    return input("请输入要查询的学号或姓名关键词:")

# ------------ 功能6:获取要修改的学号和成绩 ------------
def get_modify_info():
    """获取要修改的学生学号和新成绩"""
    student_id = input("请输入要修改的学生学号:")
    # 选择要修改的科目
    while True:
        print("1. 修改数学成绩")
        print("2. 修改语文成绩")
        try:
            subject_choice = int(input("请输入要修改的科目:"))
            if subject_choice == 1:
                subject = "数学成绩"
                break
            elif subject_choice == 2:
                subject = "语文成绩"
                break
            else:
                print("输入错误!请输入1或2!")
        except ValueError:
            print("输入错误!请输入数字!")
    # 获取新成绩
    while True:
        try:
            new_score = float(input(f"请输入新的{subject}:"))
            break
        except ValueError:
            print(f"{subject}必须是数字!请重新输入!")
    # 返回要修改的学号、科目、新成绩
    return student_id, subject, new_score

小白测试: 打开 PyCharm,运行 ui.py,会发现没有输出 —— 这是正常的!因为 ui.py 里都是函数定义,没有调用函数。你可以在 ui.py 最后加一行print_menu(),再运行,就能看到菜单了。


2.2 实现【Core 模块】(core.py):系统的 “大脑”

(这个模块只做 “核心业务逻辑” 的事:增删改查学生信息,不涉及和用户交互,也不涉及文件读写)

# core.py:核心功能模块
# ------------ 功能1:添加学生 ------------
def add_student(students_list, student_info):
    """
    给学生列表添加新学生
    参数:
        students_list:存放所有学生的列表(必须是列表类型)
        student_info:要添加的学生信息(必须是字典类型)
    返回值:
        True:添加成功
        False:添加失败(因为学号重复)
    """
    # 检查学号是否重复:遍历学生列表,看有没有学号和要添加的学生相同的
    for student in students_list:
        if student["学号"] == student_info["学号"]:
            return False  # 学号重复,添加失败
    # 学号不重复,把新学生添加到列表
    students_list.append(student_info)
    return True  # 添加成功

# ------------ 功能2:删除学生 ------------
def delete_student(students_list, delete_id):
    """
    从学生列表中删除指定学号的学生
    参数:
        students_list:学生列表
        delete_id:要删除的学生学号
    返回值:
        True:删除成功
        False:删除失败(找不到该学号的学生)
    """
    # 遍历学生列表,用enumerate获取索引和学生信息(索引用于删除)
    for index, student in enumerate(students_list):
        if student["学号"] == delete_id:
            del students_list[index]  # 删除该索引的学生
            return True  # 删除成功
    return False  # 找不到该学号的学生,删除失败

# ------------ 功能3:查询学生 ------------
def query_student(students_list, keyword):
    """
    查询学生列表中符合关键词的学生
    参数:
        students_list:学生列表
        keyword:查询关键词(学号或姓名的一部分)
    返回值:
        result_list:符合条件的学生列表(空列表表示没有找到)
    """
    result_list = []
    # 遍历学生列表,检查学号或姓名是否包含关键词
    for student in students_list:
        # 把学号和姓名转成小写,方便模糊查询(比如输入“张”能找到“张三”“张四”,输入“zh”也能找到)
        if keyword.lower() in student["学号"].lower() or keyword.lower() in student["姓名"].lower():
            result_list.append(student)
    return result_list

# ------------ 功能4:修改学生成绩 ------------
def modify_student_score(students_list, student_id, subject, new_score):
    """
    修改学生的指定科目成绩
    参数:
        students_list:学生列表
        student_id:要修改的学生学号
        subject:要修改的科目(必须是“数学成绩”或“语文成绩”)
        new_score:新的成绩
    返回值:
        True:修改成功
        False:修改失败(找不到该学号的学生)
    """
    for student in students_list:
        if student["学号"] == student_id:
            student[subject] = new_score  # 修改该学生的指定科目成绩
            return True  # 修改成功
    return False  # 修改失败

小白测试: 你可以在 core.py 最后加以下测试代码,运行看效果:

# 测试Core模块
test_students = []
# 测试添加学生
test_student = {"学号": "2024052001", "姓名": "张三", "班级": "一年级一班", "数学成绩": 95, "语文成绩": 90}
add_result = add_student(test_students, test_student)
print(f"添加学生结果:{add_result}")  # 应该输出True
# 测试重复添加
add_result2 = add_student(test_students, test_student)
print(f"重复添加学生结果:{add_result2}")  # 应该输出False
# 测试查询
query_result = query_student(test_students, "张")
print(f"查询结果:{query_result}")  # 应该输出[{'学号': '2024052001', ...}]

2.3 实现【DB 模块】(db.py):系统的 “硬盘”

(这个模块只做 “数据存储” 的事:把学生列表保存到 json 文件,从 json 文件读取学生列表,不涉及其他功能)

# db.py:数据存储模块
import json  # 导入Python自带的json模块,用于数据格式化

# 数据文件的路径:把数据保存到项目根目录的student_data.json文件
DATA_FILE_PATH = "student_data.json"

# ------------ 功能1:从json文件读取学生数据 ------------
def load_data():
    """
    从json文件读取学生数据
    返回值:
        students_list:学生列表(如果文件不存在或读取失败,返回空列表)
    """
    try:
        # 打开json文件:r表示只读,encoding="utf-8"防止中文乱码
        with open(DATA_FILE_PATH, "r", encoding="utf-8") as f:
            # 把json字符串转成Python的列表
            students_list = json.load(f)
        return students_list
    except FileNotFoundError:
        # 文件不存在时(第一次运行系统时),返回空列表
        return []
    except json.JSONDecodeError:
        # 文件内容格式错误时,返回空列表
        return []
    except Exception as e:
        # 其他未知错误时,打印错误信息并返回空列表
        print(f"读取数据失败:{e}")
        return []

# ------------ 功能2:把学生数据保存到json文件 ------------
def save_data(students_list):
    """
    把学生列表保存到json文件
    参数:
        students_list:要保存的学生列表
    返回值:
        True:保存成功
        False:保存失败
    """
    try:
        # 打开json文件:w表示写入(覆盖原有内容),encoding="utf-8"防止中文乱码
        # indent=4:保存的json文件格式美化(每个层级缩进4个空格),方便人阅读
        with open(DATA_FILE_PATH, "w", encoding="utf-8") as f:
            json.dump(students_list, f, ensure_ascii=False, indent=4)
        return True  # 保存成功
    except Exception as e:
        # 保存失败时,打印错误信息
        print(f"保存数据失败:{e}")
        return False  # 保存失败

小白测试: 在 db.py 最后加以下测试代码,运行看效果:

# 测试DB模块
test_students = [
    {"学号": "2024052001", "姓名": "张三", "班级": "一年级一班", "数学成绩": 95, "语文成绩": 90},
    {"学号": "2024052002", "姓名": "李四", "班级": "一年级二班", "数学成绩": 85, "语文成绩": 80}
]
# 测试保存数据
save_result = save_data(test_students)
print(f"保存数据结果:{save_result}")  # 应该输出True
# 测试读取数据
load_result = load_data()
print(f"读取数据结果:{load_result}")  # 应该输出测试的学生列表
  • 运行后,你会在项目根目录看到一个student_data.json文件,打开后是美化过的 json 格式,里面有你测试的学生数据

2.4 实现【Main 模块】(main.py):系统的 “心脏”

(这个模块只做 “串起所有模块” 的事:调用 UI、Core、DB 模块的函数,让系统运行起来)

# main.py:主程序入口(必须运行这个文件,系统才会启动)
# 导入所有模块
import ui  # 导入UI模块
import core  # 导入Core模块
import db  # 导入DB模块

# ------------ 主程序的核心逻辑 ------------
def main():
    """主程序函数"""
    # 1. 初始化:从json文件读取已保存的学生数据
    students = db.load_data()
    print("数据加载完成!")

    # 2. 主循环:不断显示菜单、处理用户选择
    while True:
        # 2.1 打印菜单
        ui.print_menu()
        # 2.2 获取用户的有效选择
        choice = ui.get_user_choice()
        # 2.3 根据选择执行对应的功能
        if choice == 1:
            # 选择1:添加学生
            student_info = ui.get_student_info()  # 获取学生信息
            add_result = core.add_student(students, student_info)  # 调用Core模块添加学生
            if add_result:
                print("添加学生成功!")
            else:
                print("添加学生失败!学号已存在!")
        elif choice == 2:
            # 选择2:删除学生
            delete_id = ui.get_delete_id()  # 获取要删除的学号
            delete_result = core.delete_student(students, delete_id)  # 调用Core模块删除学生
            if delete_result:
                print("删除学生成功!")
            else:
                print("删除学生失败!未找到该学号的学生!")
        elif choice == 3:
            # 选择3:查询学生
            keyword = ui.get_query_keyword()  # 获取查询关键词
            query_result = core.query_student(students, keyword)  # 调用Core模块查询学生
            if query_result:
                # 打印查询结果(美化格式)
                print("查询结果如下:")
                print("-" * 50)
                for student in query_result:
                    print(f"学号:{student['学号']}")
                    print(f"姓名:{student['姓名']}")
                    print(f"班级:{student['班级']}")
                    print(f"数学成绩:{student['数学成绩']}")
                    print(f"语文成绩:{student['语文成绩']}")
                    print("-" * 50)
            else:
                print("未找到符合条件的学生!")
        elif choice == 4:
            # 选择4:修改成绩
            student_id, subject, new_score = ui.get_modify_info()  # 获取修改信息
            modify_result = core.modify_student_score(students, student_id, subject, new_score)  # 调用Core模块修改成绩
            if modify_result:
                print("修改成绩成功!")
            else:
                print("修改成绩失败!未找到该学号的学生!")
        elif choice == 5:
            # 选择5:手动保存数据
            save_result = db.save_data(students)  # 调用DB模块保存数据
            if save_result:
                print("手动保存数据成功!")
            else:
                print("手动保存数据失败!")
        elif choice == 6:
            # 选择6:退出系统
            print("正在退出系统...")
            # 退出前自动保存数据
            save_result = db.save_data(students)
            if save_result:
                print("数据已自动保存!")
            else:
                print("数据自动保存失败!请手动保存!")
            print("系统已退出!")
            break  # 跳出主循环,结束程序

# ------------ 运行主程序 ------------
if __name__ == "__main__":
    # 只有当直接运行main.py时,才会执行main()函数
    # 这样可以防止import main时自动运行main()函数
    main()

小白测试: 运行 main.py,你会看到系统菜单,然后可以测试所有功能:

  1. 输入 1,添加学生信息
  2. 输入 3,查询刚才添加的学生
  3. 输入 4,修改他的数学成绩
  4. 输入 5,手动保存数据
  5. 输入 6,退出系统
  6. 再次运行 main.py,刚才添加的学生信息还在 —— 这就是 “数据持久化” 的效果!

【测试优化篇】:从 “能用” 到 “好用” 的零基础优化方法

3.1 测试:零基础必须做的 “5 种边界测试”

(什么是 “边界测试”?就是测试 “异常情况”,比如用户输入错误的内容,系统会不会崩溃)

测试场景操作步骤预期结果
输入非数字选择运行系统,输入 “abc”系统提示 “输入错误!请输入数字!”,不会崩溃
输入超出范围的数字运行系统,输入 “7”系统提示 “输入错误!请输入 1-6 之间的数字!”,不会崩溃
输入重复的学号添加学生时,输入已存在的学号系统提示 “添加学生失败!学号已存在!”,不会崩溃
输入不存在的学号删除删除学生时,输入 “999999”系统提示 “删除学生失败!未找到该学号的学生!”,不会崩溃
输入非数字的成绩添加学生时,数学成绩输入 “abc”系统提示 “数学成绩必须是数字!请重新输入!”,不会崩溃

3.2 优化 1:给系统加 “彩色字体”(零基础可选,用 colorama 库)

(让菜单和提示信息变得好看,用 colorama 库,Python 自带的)

步骤 1:安装 colorama 库
  • 打开 cmd,输入pip install colorama,按回车
步骤 2:修改 ui.py 的 print_menu () 函数
# 在ui.py顶部导入colorama库
from colorama import Fore, Style, init
# 初始化colorama(解决Windows的颜色显示问题)
init(autoreset=True)

# 美化后的print_menu()函数
def print_menu():
    print("=" * 40)
    print(Fore.GREEN + "       学生管理系统 V1.0" + Style.RESET_ALL)  # 绿色标题
    print(Fore.CYAN + "1.  添加学生信息" + Style.RESET_ALL)  # 青色选项
    print(Fore.CYAN + "2.  删除学生信息" + Style.RESET_ALL)
    print(Fore.CYAN + "3.  查询学生信息" + Style.RESET_ALL)
    print(Fore.CYAN + "4.  修改学生成绩" + Style.RESET_ALL)
    print(Fore.CYAN + "5.  手动保存数据" + Style.RESET_ALL)
    print(Fore.RED + "6.  退出系统" + Style.RESET_ALL)  # 红色退出选项
    print("=" * 40)
  • 运行系统,你会看到彩色的菜单!

3.3 优化 2:添加 “导出为 CSV 文件” 功能(用于 Excel 打开)

(让系统可以把学生信息导出成 Excel 能打开的 CSV 文件,用 Python 自带的 csv 模块)

步骤 1:在 db.py 里添加导出 CSV 的功能
# 在db.py里导入csv模块
import csv

# ------------ 功能3:导出学生数据为CSV文件 ------------
def export_csv(students_list):
    """
    把学生数据导出为CSV文件
    参数:
        students_list:要导出的学生列表
    返回值:
        True:导出成功
        False:导出失败
    """
    csv_file_path = "student_data.csv"
    # 确定CSV的表头(和学生字典的键一致)
    headers = ["学号", "姓名", "班级", "数学成绩", "语文成绩"]
    try:
        # 打开CSV文件:w表示写入,newline=""防止空行,encoding="utf-8-sig"防止Excel打开中文乱码
        with open(csv_file_path, "w", newline="", encoding="utf-8-sig") as f:
            writer = csv.DictWriter(f, fieldnames=headers)  # 创建DictWriter对象
            writer.writeheader()  # 写入表头
            writer.writerows(students_list)  # 写入所有学生数据
        return True
    except Exception as e:
        print(f"导出CSV失败:{e}")
        return False
步骤 2:在 ui.py 里添加导出的菜单选项
# 在ui.py的print_menu()里添加第7个选项
print("7.  导出数据为CSV文件")

# 在ui.py的get_user_choice()里修改范围为1-7
if 1 <= choice <= 7:
    return choice

# 在ui.py里添加获取导出确认的函数
def get_export_confirm():
    """获取用户是否确认导出的选择"""
    while True:
        confirm = input("确定要导出为CSV文件吗?(y/n):")
        if confirm.lower() in ["y", "yes"]:
            return True
        elif confirm.lower() in ["n", "no"]:
            return False
        else:
            print("输入错误!请输入y或n!")
步骤 3:在 main.py 里添加导出的逻辑
# 在main.py的主循环里添加第7个选择
elif choice == 7:
    # 选择7:导出数据为CSV文件
    confirm = ui.get_export_confirm()  # 获取确认
    if confirm:
        export_result = db.export_csv(students)  # 调用DB模块导出CSV
        if export_result:
            print("导出CSV成功!文件已保存为student_data.csv!")
        else:
            print("导出CSV失败!")
    else:
        print("已取消导出!")
  • 运行系统,输入 7,就能导出 CSV 文件,用 Excel 打开就能看到学生信息!

【上线篇】:把系统 “打包成 exe 文件”

(什么是 “打包成 exe 文件”?就是让系统变成 “双击就能运行的小软件”,不用开 Python 环境,给老师用也方便)

步骤 1:安装 pyinstaller 库

  • 打开 cmd,输入pip install pyinstaller,按回车

步骤 2:打包系统

  • 打开 cmd,进入项目根目录(比如cd E:\StudentManagement
  • 输入以下命令:
    pyinstaller -F -w main.py
    
    • F:打包成单个 exe 文件(否则会有很多依赖文件)
    • w:运行时不显示 cmd 窗口(美观)

步骤 3:找到 exe 文件

  • 打包完成后,项目根目录会出现dist文件夹
  • 进入dist文件夹,就能看到main.exe文件 —— 这就是你的 “学生管理系统” 软件!

步骤 4:测试 exe 文件

  • 双击main.exe,系统会直接运行,所有功能和之前一样
  • 注意:exe 文件会在当前目录创建student_data.jsonstudent_data.csv文件,所以要把 exe 文件放在一个单独的文件夹里

【拓展篇】:零基础小白的 “进阶方向”

4.1 进阶 1:用 tkinter 做 “图形界面”(Python 自带)

(把文字菜单变成 “按钮、输入框” 的图形界面,更直观)

4.2 进阶 2:用 sqlite3 做 “数据库存储”(Python 自带)

(把 json 文件换成数据库,支持更复杂的查询和数据管理)

4.3 进阶 3:用 Flask 做 “Web 版系统”

(让系统可以在浏览器里运行,支持多人同时使用)

4.4 进阶 4:添加 “密码登录” 功能

(让只有老师能登录系统,保护学生信息)


【结尾篇】:零基础做项目的 “心态调整”

(这是比代码更重要的东西!)

  1. 不要怕出错:小白写代码 90% 的时间都在 “debug”(找错误),比如缩进错误、变量名打错、忘记加括号 —— 这是正常的!
  2. 不要贪多:先做最基础的版本,再慢慢加功能,不要一开始就想做 “完美的系统”
  3. 要多问 “为什么”:每写一行代码都要想 “我为什么要用它?”“它能解决什么问题?”,不要复制别人的代码
  4. 要坚持:做项目不是 “一次就能成功” 的,可能要修改几十次甚至上百次,坚持下来就能看到成果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值