文章目录
- [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 环境即可运行。
如下所示:
