ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python 入门小练习,实现 简易学生成绩管理

Python 入门小练习,实现 简易学生成绩管理 Python 学习笔记CSV 简易学生成绩管理前言最近在做 Python 入门练习实现了一个命令行版本的学生成绩管理小程序。整个项目没有使用任何第三方工具库用到的都是初学阶段常见知识点自定义函数、列表、while 循环、if 分支判断以及简单的文件读写操作。简单说说这个小程序的整体工作逻辑。学生成绩保存在 CSV 文本文件中程序启动的时候会先把文件里全部的成绩读取出来放到内存的列表里面。后续我们查看成绩、查找学生、新增、删除或者修改分数改动的都只是内存中的这份列表数据。这个时候原始文件并不会发生任何变化只有选择菜单里的退出选项才会把修改完成的数据保存到一份全新的 CSV 文件中。这里有一个初学者很容易踩的坑如果做完增删改操作直接关闭程序而不是通过菜单 6 正常退出刚刚做的所有修改都会丢失不会保存到本地文件。程序把每一项独立功能封装成一个个函数。如果不使用函数所有代码堆在一起整个脚本就会显得杂乱阅读和调试都很麻烦。把每件事情单独抽成函数之后需要哪个功能就调用哪个函数逻辑会清晰不少。程序中有一个全局列表cjlb相当于我们临时存放全部学生数据的容器。列表里面的每一个子列表代表一位学生结构为[学号, 姓名, 语文, 数学, 英语]。1、读取成绩函数 dqcj()读取成绩程序刚启动就会调用这个函数用来打开本地的 score.csv 文件读取数据。open(..., r)r 代表 read也就是只读模式只读取文件内容不会修改原文件。for line in f1循环读取文件每次读取一行内容文件中的每一行对应一位学生信息。strip()文本每一行末尾都会自带换行符号如果不去除读取出来的数据会附带多余换行所以用这个方法清除行首行尾的空白和换行符。split(,)CSV 文件里各项信息是用逗号隔开的用逗号把一整行文本切分开得到一个小列表。举个例子文本内容001,张三,88,90,76切割之后得到[001,张三,88,90,76]。注意一点从文件读取出来的全部内容默认都是字符串类型这里的分数只是一段文字不能直接当作数字使用所以代码中使用 eval 把分数转为数字。eval 仅适合课堂练习实际开发尽量不要使用。append()把处理完成的单条学生信息添加到大列表cjlb当中。f1.close()文件打开使用完毕最好手动关闭如果一直保持打开状态会占用系统资源。坑点提示代码路径写的是lbks//score.csv表示 lbks 文件夹下的 score.csv 文件。电脑上如果没有这个文件夹或者源文件运行程序就会直接报错需要我们自己手动创建。2、显示全部成绩 xscj()显示成绩这个函数作用就是把内存列表里面所有学生信息打印输出。通过 for 循环遍历cjlb循环变量 lb 代表每一位学生的子列表。lb [0] 是学号、lb [1] 是姓名后面依次是三科成绩。format 的作用就是把列表的数据填充到字符串的大括号中完成打印。这里只是读取列表做展示不会修改任何数据。3、按学号查询成绩 cjcx ()(查询成绩)运行之后先用 input 接收我们输入的学号再循环逐个对比每一个学生的学号。如果找到匹配的学号就打印该学生信息执行 break 跳出循环不用继续往下遍历剩下的数据。这里用到 for‑else 语法初学的时候很容易理解不了它的逻辑。简单来讲如果 for 循环里面执行了 break那么 else 里面的代码就不会运行如果整个循环完整跑完始终没有触发 break就说明没有找到目标数据这时执行 else 分支打印 “查无此人”。很多新手会自己定义标记变量实现这个逻辑for‑else 相当于简化写法。4、新增学生成绩 cjxz ()新增成绩新增学生的时候首先要做学号查重学号不能重复。输入学号之后遍历整个列表如果发现已经存在这个学号提示学号已存在执行 break 直接结束不再执行新增逻辑。同样借助 for-else如果循环走完没有发现重复学号就进入 else 分支依次录入姓名、语文、数学、英语分数组装成一条学生数据通过 append 添加到cjlb列表。⚠️注意此时仅仅是把数据加到内存列表并没有写入 CSV 文件必须执行退出保存操作才会真正保存到磁盘。5、删除学生成绩 cjsc ()删除成绩输入想要删除学生的学号循环查找对应记录。找到匹配学号后使用列表的 remove 方法直接把这条学生数据从cjlb当中移除。这个操作修改的依旧是内存里的列表原始文件还没有变化。找不到学生就进入 else 分支提示查无此人。6、修改学生成绩 cjxg ()修改成绩输入学号定位学生先把该学生当前信息打印出来看一下再询问是否确认修改输入 y 代表确认修改。接着输入新的姓名和三科分数这里做了一层简单校验。isnumeric()用来判断输入内容是不是纯数字防止输入字母或者符号再进一步判断分数范围需要介于 0-100 之间。校验全部通过之后直接修改子列表里面对应的字段值校验失败就提示成绩错误放弃本次修改。lb 就是大列表里面其中一条数据的引用修改 lb 里面的值也就相当于修改了cjlb里面的数据。7、保存数据函数 cjxr()写入成绩这个函数负责把内存列表里面的全部数据写入磁盘文件 score2.csv。open(..., w)w 代表 write 写入模式。这里有个关键点如果 score2.csv 文件已经存在w 模式会清空原有全部内容再写入新的数据旧内容直接被覆盖。列表中的分数现在是数字类型写到文本文件需要转为字符串使用 str() 完成转换。手动拼接字符串各项之间用逗号隔开每一行末尾加上换行符\n一行一行写入文件完成之后关闭文件句柄。这个函数只有在菜单选择 6 退出的时候才会调用日常增删改操作不会自动保存。8、主程序逻辑cjlb[]定义一个空的全局列表整个程序共用这个列表存储学生数据。程序一开始调用 dqcj () 读取文件加载初始成绩数据。while True是无限循环用来实现菜单循环展示做完一项功能之后回到菜单页面。打印功能提示接收用户输入选项 num通过 elif 多分支判断输入对应数字就调用对应的功能函数。如果输入数字 6先执行 cjxr 保存文件再用 break 跳出 while 循环菜单结束。while 循环结束之后末尾代码打开刚刚保存好的 score2.csv 并且打印全部内容。这一段主要用来调试查看保存效果实际使用的时候可以删掉。运行前准备在项目文件夹下面新建子文件夹 lbks再新建 score.csv 文件。CSV 文件格式学号姓名语文数学英语。下面是测试样例数据可以复制粘贴进 score.csv 做测试Windows 环境下代码使用双斜杠//表示路径如果路径写错程序会报找不到文件。eval 函数仅适合学习练习正式开发尽量避免使用。学习小结完成这个小案例可以巩固这些入门知识点文件的打开与关闭读模式r和写模式w尤其注意w模式会直接覆盖旧文件这点很容易踩坑。字符串处理strip去除换行空白split按照符号切割字符串简单理解 CSV 本质就是普通文本。自定义函数的使用把不同功能拆分出来主程序只负责菜单调度。for‑else语法不用自己定义标记变量来判断是否找到目标。列表常用操作append追加、remove删除以及列表嵌套列表的用法。分清内存和磁盘文件的区别修改内存列表不等于修改文件只有执行写入操作数据才真正保存到硬盘这是这个练习最核心的理解点。
返回列表