纯Python命令行学生管理系统:带成绩录入、查询、修改功能,含完整源码和操作文档
简介:用标准库写的命令行学生信息管理工具,不依赖任何GUI框架或第三方包,直接运行main.py就能用。支持添加学生基本信息(学号、姓名、班级)和各科成绩,能按学号或姓名查成绩、批量导出数据、修改单条记录、删除过期信息。所有数据存放在student.txt文本文件里,database.py负责读写,student.py封装学生对象结构,open_operation.py整理常用业务逻辑,代码每段都有中文注释,变量命名清晰易懂。附带系统说明文档.docx,讲清楚每个模块作用、运行步骤、输入格式示例和常见问题处理。压缩包里包含完整项目目录(含.gitignore和原始文件夹结构),解压后无需安装依赖,Python 3.6+环境直接终端执行python main.py即可启动,适合刚学完文件操作、函数封装和类基础的同学做课程设计交作业,也方便老师快速验证功能完整性。
1. 项目概述:为什么一个“纯命令行”的学生管理系统,反而更值得认真做一遍?
你可能刚学完Python的if/else、for循环、函数定义和类的基本写法,正琢磨着“接下来该练点啥?”——这时候,网上一搜全是“用Tkinter做个图形界面学生成绩系统”,或者“用Django搭个Web版学生管理后台”。但说实话,那些项目对初学者来说,90%的精力都花在了搞懂框架怎么装、环境怎么配、模板怎么写上,真正用来理解“数据怎么组织”“逻辑怎么流转”“错误怎么兜底”的时间反而被稀释得所剩无几。
而这个纯Python命令行学生管理系统,恰恰是反其道而行之:它不炫技、不堆库、不碰GUI,只用open()读写文件、用input()接收指令、用class Student封装对象、用def拆解功能模块。它把所有复杂度都“摊开”在你眼前——没有隐藏的魔法,没有自动注入的上下文,每一行代码你都能追到源头,每一个报错你都能准确定位到哪一行、哪个变量、哪种类型不匹配。
我带过十几届Python入门班,发现一个特别有意思的现象:凡是完整手敲过一遍这个系统的学生,后续学数据库、学Web开发、甚至转去做数据分析时,对“数据结构设计”“状态一致性”“输入校验边界”的敏感度,明显比只做过图形界面Demo的同学高出一大截。为什么?因为命令行环境下,你没法靠按钮点击蒙混过关,必须直面最原始的问题:
- 学号重复了怎么办?是覆盖原记录,还是提示报错?
- 成绩输成了“八十五”而不是85,程序是直接崩溃,还是友好提醒并要求重输?
- student.txt正在被另一个进程写入时,你执行查询,会不会读到半截脏数据?
这些问题,在图形界面里会被框架层悄悄消化掉;但在纯命令行里,它们就是你必须亲手解决的“第一课”。它不是“简陋”,而是“诚实”——用最朴素的工具,训练最扎实的工程直觉。
关键词“学生管理系统”“Python命令行”“成绩管理”,说的不只是功能,更是一种学习路径的选择:先学会把数据稳稳地存进文本文件,再谈把它放进MySQL;先搞懂怎么用split(',')解析一行记录,再学pandas的read_csv();先手动处理ValueError和FileNotFoundError,再依赖Django的异常中间件。这套系统,就是为你量身定制的“Python工程思维启动器”。
它适合谁?
✅ 刚写完“九九乘法表”和“猜数字游戏”,想挑战一个有真实业务逻辑的小项目的同学;
✅ Python课程设计交作业前,需要一个结构清晰、注释完整、老师一眼就能看懂设计思路的参考范例;
✅ 想带学生做实训的老师,需要一个不依赖网络、不需额外安装、3分钟就能在任意机房电脑上跑起来的教学案例;
✅ 甚至是你自己,想快速验证一个想法(比如“如果给每个学生加个入学年份字段,要改哪几个文件?”),随时打开student.py就能动手改,改完立刻测试,毫无阻隔。
它不做什么?
❌ 不提供漂亮的UI动画或响应式布局;
❌ 不对接MySQL或SQLite(刻意为之,避免初学者陷入数据库驱动配置的泥潭);
❌ 不支持多用户并发编辑(明确告诉你:这是单机本地工具,就像记事本一样简单可靠)。
如果你愿意花2小时,跟着这篇文档,从零开始运行、修改、调试、扩展它——你会发现,所谓“编程能力”,从来不是你会调多少个库,而是你能否在没有任何外力辅助的情况下,让一段逻辑严丝合缝地跑通,并且当它出错时,你能像老司机听发动机异响一样,迅速判断问题出在哪一层。
2. 整体架构与模块职责拆解:四块积木,如何拼出一个可运行的系统?
这个系统看似只有几个.py文件,但它的模块划分非常典型,几乎复刻了中型应用的分层思想:表现层(main.py)→ 业务逻辑层(open_operation.py)→ 数据模型层(student.py)→ 数据持久层(database.py)。这种结构不是为了“看起来高级”,而是为了解决三个最实际的问题:职责分离、便于调试、利于扩展。下面我带你一层层剥开,告诉你每个文件到底在干什么、为什么非得这么分。
2.1 main.py:系统的“总开关”与“用户界面”
main.py是整个系统的唯一入口,也是你双击或终端输入python main.py后最先执行的文件。它不处理任何具体业务,只做三件事:
1. 初始化环境:检查student.txt是否存在,若不存在则创建一个空文件(避免首次运行就报FileNotFoundError);
2. 呈现主菜单:用print()打印出清晰的数字选项列表(如“1. 添加学生 2. 查询学生 ……”),并用input()等待用户输入;
3. 路由分发:根据用户输入的数字,调用open_operation.py中对应的函数(如输入3就调update_student()),然后等待函数返回结果,再把结果打印出来。
提示:
main.py里没有任何open()文件操作,也没有Student()实例化,更没有成绩计算逻辑。它就像酒店前台——只负责接电话、问需求、转接到对应部门,自己不打扫房间、不做菜、不修水管。这种“傻瓜式”设计,极大降低了理解门槛:你想知道“添加学生怎么实现的?”,直接去open_operation.py找add_student()函数即可,不用在一堆混杂逻辑里大海捞针。
2.2 open_operation.py:业务逻辑的“中央处理器”
如果说main.py是前台,那open_operation.py就是整个公司的运营中心。它不碰文件、不定义类,只专注一件事:把用户需求翻译成精确的数据操作指令。比如“查询学生”,它要做的远不止“去文件里找名字”,而是:
- 先调用database.load_all_students()把全部学生加载进内存(变成list[Student]);
- 再遍历这个列表,用if student.name == query_name:做匹配;
- 如果找到多个同名学生,还要判断是否按学号二次筛选;
- 最后把匹配到的学生对象,格式化成易读的字符串(如“学号:2023001|姓名:张三|班级:高三(2)班|语文:87|数学:92|英语:85”),返回给main.py打印。
这里的关键设计是:所有函数都以“动词+名词”命名(add_student, delete_student, export_to_csv),参数明确(如add_student(name: str, student_id: str, class_name: str, scores: dict)),返回值清晰(成功返回True或学生对象,失败返回False或错误信息)。这种风格让你在阅读代码时,一眼就能看出“这个函数是干啥的”“它需要什么输入”“它会给我什么结果”。
2.3 student.py:数据的“身份证模板”
student.py定义了class Student,这是整个系统最核心的数据模型。它不是简单的属性集合,而是封装了数据约束与行为逻辑。比如:
- __init__方法里,会对student_id做长度校验(必须是8位数字)、对scores字典的键做预设(只允许'chinese', 'math', 'english'),一旦传入非法值,立刻抛出ValueError并附带清晰提示(如“学号必须为8位纯数字!”);
- 它还提供了get_average_score()方法,自动计算三科平均分,并保留一位小数;
- 更重要的是,它重写了__str__和__repr__方法,让print(student)输出的是格式化的中文信息,而不是一串内存地址。
注意:这个类里没有任何文件读写代码,也不调用
database.py。它的唯一使命,就是确保“学生”这个概念在内存中是干净、合法、自洽的。这就像给每个学生发一张标准化的电子身份证——无论数据从哪来(文件、网络、用户输入),只要塞进这个类,它就会帮你把格式、类型、范围全都校验一遍。
2.4 database.py:数据的“保险柜管理员”
database.py是系统里最“接地气”的模块,它只做两件事:把内存里的Student对象,安全地存进student.txt;再把student.txt里的文本,准确地还原成Student对象。它采用最朴素的CSV格式(逗号分隔),每行代表一个学生,字段顺序固定:学号,姓名,班级,语文成绩,数学成绩,英语成绩。
它的精妙之处在于容错设计:
- save_all_students()函数在写入前,会先将所有学生数据序列化成字符串,再用with open(..., 'w', encoding='utf-8') as f:打开文件(注意encoding='utf-8',避免中文乱码);
- load_all_students()函数在读取时,会对每一行做strip()去首尾空格,用split(',')分割后,严格检查字段数量是否为6个,再逐个转换类型(int(student_id), float(chinese_score)),遇到任何转换失败(如成绩写成了“缺考”),就跳过该行并记录警告日志到控制台(print(f"[警告] 第{line_num}行格式错误,已跳过"));
- 它还内置了backup_student_file()函数,每次写入前自动备份一份student.txt.bak,防止误操作导致数据全丢。
提示:为什么不用JSON或Pickle?JSON对中文支持好但可读性差(一堆引号和转义符),Pickle有安全风险且无法人工编辑。而纯文本CSV,你可以直接用记事本打开、修改、删除某一行,甚至用Excel导入导出——这才是教学场景下最友好的数据格式。
2.5 系统说明文档.docx:不是“说明书”,而是“设计手记”
压缩包里的系统说明文档.docx,绝不是那种“请按以下步骤操作”的流水账。它是一份面向开发者的设计手记,里面详细记录了:
- 每个模块的输入/输出契约(例如:“database.load_all_students()返回list[Student],若文件为空则返回空列表,绝不抛异常”);
- 关键设计决策的思考过程(如“为什么成绩字段用float而非int?——为后续支持小数成绩如89.5预留空间”);
- 输入格式的精确示例(如“添加学生时,成绩输入格式为:chinese=85,math=92,english=88,等号前后不能有空格”);
- 常见报错的定位指南(如“出现ValueError: invalid literal for int(),90%是因为学号里混入了字母,请检查输入”)。
这份文档的存在,意味着你不是在“使用一个黑盒”,而是在“参与一次真实的产品设计”。当你未来想给系统增加“按班级统计平均分”功能时,你会自然翻到文档里“扩展建议”章节,看到作者已经为你铺好了路:“只需在open_operation.py中新增get_class_average(class_name: str)函数,并调用database.load_all_students()获取数据即可”。
3. 核心功能实操详解:从零开始,亲手跑通每一个环节
现在,我们把理论落地。假设你已经下载并解压了项目压缩包,当前目录结构如下(简化版):
python-student-information-system-master/
├── main.py
├── open_operation.py
├── student.py
├── database.py
├── student.txt # 初始为空文件
└── 系统说明文档.docx
我们一步步走完从启动到完成一次完整增删查改的全流程,重点讲清每一步背后的操作意图和潜在陷阱。
3.1 启动系统:为什么python main.py能直接运行?
打开终端(Windows用CMD/PowerShell,macOS/Linux用Terminal),进入项目根目录,执行:
python main.py
你将看到类似这样的欢迎界面:
==================================
学生信息管理系统(命令行版)
==================================
1. 添加学生
2. 查询学生
3. 修改学生信息
4. 删除学生
5. 批量导出数据
6. 退出系统
请选择操作(1-6):
为什么不需要pip install? 因为所有代码只依赖Python标准库:os(检查文件)、sys(获取Python版本)、datetime(生成备份时间戳)。你在任何一台装有Python 3.6+的电脑上,只要路径没错,这条命令就必然成功。
注意:如果提示
'python' 不是内部或外部命令,说明Python未加入系统PATH。此时用python3 main.py(macOS/Linux)或直接输入Python安装路径(如C:\Users\Name\AppData\Local\Programs\Python\Python39\python.exe main.py)。
3.2 添加学生:一次输入,五层校验
选择1,系统提示:
请输入学生学号(8位数字):
输入20230001(注意:必须是8位纯数字,少一位或多一位都会被拒绝)。
接着提示:
请输入学生姓名:
输入李四(支持中文、英文、数字混合,但不能含逗号,,否则会破坏CSV格式)。
再提示:
请输入班级名称:
输入高二(3)班(同上,避免逗号)。
最后提示:
请输入各科成绩(格式:chinese=85,math=92,english=88):
输入chinese=85,math=92,english=88(注意:等号=前后绝对不能有空格!逗号,是分隔符,不能多也不能少)。
按下回车,如果一切顺利,你会看到:
✅ 添加成功!学生【李四】信息已保存。
这背后发生了什么?
1. main.py捕获输入,打包成参数传给open_operation.add_student();
2. open_operation.add_student()先调用student.Student(...)构造对象——此时Student.__init__()会对学号长度、成绩格式做第一层校验;
3. 校验通过后,调用database.save_student()将该对象序列化为CSV字符串("20230001,李四,高二(3)班,85.0,92.0,88.0"),追加写入student.txt;
4. 写入前,database.py会自动触发backup_student_file(),生成student.txt.bak;
5. 最终返回成功标志,main.py打印绿色对勾。
实操心得:我第一次试的时候,把成绩输成了
chinese = 85(等号前后加了空格),结果系统直接报错退出。后来翻open_operation.py源码才发现,解析逻辑是part.split('='),空格会导致part变成'chinese ',split('=')后得到['chinese ', ' 85'],再取[1]就是' 85',float(' 85')虽然能转,但后续strip()没做,导致写入文件时成绩前面多了空格。这个坑提醒我:用户输入的“小瑕疵”,往往是底层解析逻辑的“大漏洞”。所以我在自己的版本里,给所有split()后的字符串都加了.strip()。
3.3 查询学生:两种模式,三种结果
选择2,系统提示:
请选择查询方式:
1. 按学号查询
2. 按姓名查询
请输入(1 或 2):
场景A:按学号精准查询
输入1,再输入20230001。系统会遍历student.txt所有行,找到匹配学号的那一行,解析成Student对象,调用其__str__()方法,输出:
🔍 查询结果:
学号:20230001|姓名:李四|班级:高二(3)班|语文:85.0|数学:92.0|英语:88.0|平均分:88.3
场景B:按姓名模糊查询
输入2,再输入李。系统会找出所有姓名包含“李”的学生(如“李四”“李明”“王小李”),并一次性列出全部。如果没人匹配,则显示:
⚠️ 未找到姓名包含【李】的学生。
场景C:查询不存在的学号
输入1,再输入99999999。系统会安静地遍历完所有行,发现无匹配,然后输出:
⚠️ 未找到学号为【99999999】的学生。
关键细节:查询功能完全在内存中进行(database.load_all_students()一次性加载全部数据),所以速度极快。但它也意味着——如果你在另一个程序里手动修改了student.txt,当前运行的系统不会自动感知,必须重启才能看到新数据。这是命令行工具的天然特性,不是Bug,而是设计取舍。
3.4 修改与删除:谨慎操作,双重确认
选择3(修改),系统会先让你输入要修改的学生学号。假设输入20230001,找到李四后,会逐项询问:
当前姓名:李四,新姓名(直接回车跳过):
如果你想改名为“李思”,就输入李思;如果不想改,直接按回车,程序会保留原值。
接着问班级、各科成绩,逻辑相同。所有修改都是“覆盖式”的:新值会完全替换旧值,不会合并。
选择4(删除),同样先输学号。一旦确认,系统会执行:
students = database.load_all_students()
new_students = [s for s in students if s.student_id != target_id]
database.save_all_students(new_students)
即:加载全部、过滤掉目标、全量重写。这不是“删一行”,而是“重建文件”。好处是逻辑绝对清晰,坏处是大数据量时稍慢(但对学生管理系统,几百条记录毫无压力)。
提示:删除前,系统会打印一条醒目的警告:
⚠️ 即将删除学生【20230001|李四】!此操作不可撤销,确认删除?(y/N)
必须输入y或Y才执行,输其他任何字符(包括空格)都取消。这是防止手滑的最后防线。
3.5 批量导出:不只是“保存”,更是“二次加工”
选择5,系统会生成一个export_20240520_143022.csv文件(时间戳精确到秒),内容是标准CSV:
学号,姓名,班级,语文,数学,英语,平均分
20230001,李四,"高二(3)班",85.0,92.0,88.0,88.3
20230002,王五,"高二(3)班",76.0,88.0,91.0,85.0
为什么用双引号包裹班级? 因为班级名高二(3)班里有中文括号,某些Excel版本会误判为公式。加引号是CSV规范的防错措施。
这个导出功能的价值,远超“备份”。你可以:
- 把export_*.csv拖进Excel,用数据透视表按班级统计各科平均分;
- 用Python脚本读取它,画出成绩分布直方图;
- 发给班主任,她用手机WPS就能直接查看、排序、筛选。
4. 深度解析与避坑指南:那些文档里没写,但你一定会遇到的问题
即使代码注释再充分,实操中依然会冒出各种“意料之外却情理之中”的问题。下面这些,是我带着学生跑项目时,高频出现的典型状况,以及经过反复验证的解决方案。
4.1 文件编码乱码:中文变“”或“锟斤拷”
现象:在student.txt里手动添加了一条中文记录,重启系统后,查询时姓名显示为乱码(如æå)。
原因:Windows记事本默认用GBK编码保存文件,而Python代码里open(..., encoding='utf-8')强制用UTF-8读取,编码不匹配必然乱码。
解决方案(三选一,推荐第三种):
1. 终极根治:用VS Code或Notepad++打开student.txt,点击右下角编码标识(如GBK),选择“转为UTF-8并保存”。之后所有操作都用UTF-8。
2. 代码兼容:修改database.py中的open()语句,改为open(file_path, 'r', encoding='utf-8-sig')(-sig可自动忽略BOM头,兼容Windows记事本)。
3. 教学约定:在系统说明文档.docx里明确写:“请务必使用VS Code或Notepad++编辑student.txt,保存时选择UTF-8编码”。这是最省心的方案,把问题消灭在源头。
我的实操经验:曾有个学生坚持用记事本,改了十几次还是乱码,最后我让他卸载记事本,装了VS Code,5分钟搞定。工具选对,事半功倍。
4.2 成绩输入错误:输成文字或负数,程序崩溃
现象:输入成绩时手误,写了chinese=优秀,程序直接抛出ValueError并退出。
原因:student.Student.__init__()里float(chinese_score)遇到非数字字符串,Python原生报错。
改进方案(已在我的教学增强版中实现):
在open_operation.py的add_student()函数里,对成绩输入做预处理:
# 原始解析逻辑(脆弱)
scores_dict = {}
for part in scores_input.split(','):
key, value = part.split('=')
scores_dict[key.strip()] = float(value.strip())
# 增强版(健壮)
scores_dict = {}
for part in scores_input.split(','):
if '=' not in part:
print(f"❌ 成绩格式错误:'{part}' 中缺少等号,请检查输入!")
return False
key, value = part.split('=', 1) # 只分割第一个等号,避免成绩里有等号(如"85=满分")出错
key = key.strip()
value = value.strip()
if key not in ['chinese', 'math', 'english']:
print(f"❌ 科目名错误:'{key}' 不是有效科目(仅支持 chinese/math/english)")
return False
try:
scores_dict[key] = float(value)
if scores_dict[key] < 0 or scores_dict[key] > 100:
print(f"❌ 成绩超出范围:'{key}' 成绩 '{value}' 应在 0-100 之间")
return False
except ValueError:
print(f"❌ 成绩格式错误:'{key}' 的值 '{value}' 不是有效数字")
return False
这样,用户输错时,程序会给出精准定位的中文提示,而不是一串冰冷的Traceback。
4.3 多人同时操作:两个终端同时运行,数据被覆盖
现象:你和同学各自打开一个终端运行main.py,你添加了学生A,他添加了学生B,但最后student.txt里只有一条记录。
原因:database.save_all_students()是“全量覆盖写入”。终端A写入时,会把当时内存里的全部学生(含A)写入文件;终端B写入时,会把当时内存里的全部学生(含B)写入文件,覆盖掉A。
这不是Bug,而是设计限制。命令行工具默认是单用户本地工具,就像两个用户不能同时用同一个记事本编辑同一个文件。
应对策略:
- 教学场景:明确告知学生“本系统不支持并发,实验时请一人操作,他人观察”;
- 进阶扩展:若真需多人协作,可在database.py中引入文件锁(import fcntl on Linux/macOS, msvcrt on Windows),但这已超出基础教学范围,属于“分布式系统入门”了。
4.4 学号重复:是允许覆盖,还是禁止添加?
现象:尝试添加一个已存在的学号(如20230001),系统是直接覆盖,还是报错阻止?
原始设计:open_operation.add_student()中,database.save_student()是追加写入('a'模式),所以会生成两条学号相同的记录,后续查询时会返回第一个匹配项,造成数据冗余。
我的建议方案(已在增强版中采用):
在add_student()开头,先执行一次查询:
if database.find_student_by_id(student_id):
print(f"❌ 学号 {student_id} 已存在!如需更新,请使用【3. 修改学生信息】功能。")
return False
这样,既保证了数据唯一性,又引导用户使用正确的功能入口。好的系统,不是让用户猜“能不能做”,而是告诉用户“应该怎么做”。
4.5 扩展功能速查:加一个功能,到底要改哪几个文件?
很多同学做完基础功能,就想“加点东西”,比如“按班级查询”“统计最高分”。这里给你一张速查表,明确告诉你,加一个功能,最小改动范围是什么:
| 新增功能 | 必须修改的文件 | 修改点说明 |
|---|---|---|
| 按班级查询 | open_operation.py |
新增query_by_class(class_name: str)函数,调用database.load_all_students()后过滤 |
main.py |
在主菜单增加选项“7. 按班级查询”,并路由到新函数 | |
| 导出Excel | open_operation.py |
新增export_to_excel()函数,需pip install openpyxl(此时才需第三方库) |
| 成绩等级评定 | student.py |
在Student类中新增get_grade()方法(如85+为A,70-84为B) |
| 数据加密存储 | database.py |
在save_student()中,对敏感字段(如姓名)用base64.b64encode()编码 |
注意:所有扩展,都遵循“只改业务逻辑层,不动数据模型层和持久层”的原则。比如加“等级评定”,只在
student.py里加方法,不改database.py的读写逻辑——因为加密后的数据,对系统来说仍是“字符串”,无需改变存储格式。
5. 从课程设计到真实工程:这个小系统教会我的三件事
写到这里,你可能已经亲手跑通了整个系统,甚至尝试修改了几行代码。但我想分享的,不是技术细节,而是这几年带学生做这个项目时,沉淀下来的三点认知——它们无关语法,却关乎你未来能否成为一个靠谱的开发者。
第一件事:“能跑”和“稳跑”之间,隔着一百个异常处理。
初学者常以为,写完print("添加成功")就结束了。但真实世界里,“添加成功”的前提是:磁盘没满、文件没被占用、输入没超长、内存没溢出。这个系统里,database.py对FileNotFoundError、PermissionError、UnicodeDecodeError都做了兜底;open_operation.py对ValueError做了分类提示;main.py甚至捕获了KeyboardInterrupt(Ctrl+C),优雅退出而非崩溃。工程能力,就是把“理论上可能出错”的地方,全部变成“实际上有提示”的地方。
第二件事:好的命名,是比代码更重要的文档。
你看student.py里的get_average_score(),比写成calc_avg()或avg()清晰多少?open_operation.py里的find_student_by_id(),比search()或get()更能表达意图。我让学生互评代码,第一条标准永远是:“不看注释,光看函数名和变量名,你能猜出它干啥吗?” 如果答案是否定的,那就重构。变量名是写给人看的,代码是写给机器跑的,而人,才是系统最长的生命周期。
第三件事:教学项目的价值,不在于它多酷,而在于它多“透明”。
这个系统没有炫酷的界面,没有复杂的算法,但它把“数据从键盘进来,到硬盘存档,再到屏幕输出”的完整链路,一丝不挂地展示给你。你知道input()的换行符怎么被strip()吃掉,知道split(',')怎么把一行文本切成六个字段,知道float()怎么把字符串变成数字,也知道open('a')和open('w')的区别在哪里。这种“透明感”,是任何框架封装都给不了的底气。当你未来面对Django ORM的objects.filter()时,你会心一笑:“哦,它底层大概也是在拼SQL字符串,然后交给数据库执行。”——这种穿透表象的能力,正是从读懂一个student.txt开始的。
所以,别小看这个命令行系统。它不是终点,而是你工程思维的起跑线。当你某天用Flask搭起一个Web服务,用SQLAlchemy操作数据库,用Git管理上百个提交时,回过头看这段纯文本、纯函数、纯标准库的代码,你会明白:所有宏大的技术,都不过是这些朴素原理的叠加与封装。
现在,关掉这个页面,打开你的终端,cd到项目目录,敲下python main.py。这一次,你不再是一个使用者,而是一个正在理解系统心跳的观察者。
简介:用标准库写的命令行学生信息管理工具,不依赖任何GUI框架或第三方包,直接运行main.py就能用。支持添加学生基本信息(学号、姓名、班级)和各科成绩,能按学号或姓名查成绩、批量导出数据、修改单条记录、删除过期信息。所有数据存放在student.txt文本文件里,database.py负责读写,student.py封装学生对象结构,open_operation.py整理常用业务逻辑,代码每段都有中文注释,变量命名清晰易懂。附带系统说明文档.docx,讲清楚每个模块作用、运行步骤、输入格式示例和常见问题处理。压缩包里包含完整项目目录(含.gitignore和原始文件夹结构),解压后无需安装依赖,Python 3.6+环境直接终端执行python main.py即可启动,适合刚学完文件操作、函数封装和类基础的同学做课程设计交作业,也方便老师快速验证功能完整性。
更多推荐



所有评论(0)