(面向人群:刚学完 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,添加学生信息
- 输入 3,查询刚才添加的学生
- 输入 4,修改他的数学成绩
- 输入 5,手动保存数据
- 输入 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.pyF:打包成单个 exe 文件(否则会有很多依赖文件)w:运行时不显示 cmd 窗口(美观)
步骤 3:找到 exe 文件
- 打包完成后,项目根目录会出现
dist文件夹 - 进入
dist文件夹,就能看到main.exe文件 —— 这就是你的 “学生管理系统” 软件!
步骤 4:测试 exe 文件
- 双击
main.exe,系统会直接运行,所有功能和之前一样 - 注意:exe 文件会在当前目录创建
student_data.json和student_data.csv文件,所以要把 exe 文件放在一个单独的文件夹里
【拓展篇】:零基础小白的 “进阶方向”
4.1 进阶 1:用 tkinter 做 “图形界面”(Python 自带)
(把文字菜单变成 “按钮、输入框” 的图形界面,更直观)
4.2 进阶 2:用 sqlite3 做 “数据库存储”(Python 自带)
(把 json 文件换成数据库,支持更复杂的查询和数据管理)
4.3 进阶 3:用 Flask 做 “Web 版系统”
(让系统可以在浏览器里运行,支持多人同时使用)
4.4 进阶 4:添加 “密码登录” 功能
(让只有老师能登录系统,保护学生信息)
【结尾篇】:零基础做项目的 “心态调整”
(这是比代码更重要的东西!)
- 不要怕出错:小白写代码 90% 的时间都在 “debug”(找错误),比如缩进错误、变量名打错、忘记加括号 —— 这是正常的!
- 不要贪多:先做最基础的版本,再慢慢加功能,不要一开始就想做 “完美的系统”
- 要多问 “为什么”:每写一行代码都要想 “我为什么要用它?”“它能解决什么问题?”,不要复制别人的代码
- 要坚持:做项目不是 “一次就能成功” 的,可能要修改几十次甚至上百次,坚持下来就能看到成果

28万+

被折叠的 条评论
为什么被折叠?



