Python处理数据是很方便的,用来分析学生成绩,生成成绩报告还是方便的。其实只要认真找一本Python科学计算的书籍,认真学一遍就知道怎么办了,但是系统学习成本太高,所以尽管网上免费的资源汗牛充栋,我还是要重复造轮子,也记录自己学习的过程。
对于数据科学家或者专业的程序员来说,处理excel这种事其实非常小儿科,但是成绩分析不在他们的业务范围内,所以面向教务员、信息技术老师的python成绩分析的教程相对比较少;学校里相当一部分办公室人员、行政人员、教务员都是信息技术教师担任的,很多数理老师学习编程能力也很强或者本身有编程基础,而数理老师担任班主任的挺多,也有成绩分析的需求,从这部分老师的使用场景出发,来分析python处理成绩应该怎么做,甚至扩展到办公自动化的需求。
成绩分析
实际上现在成绩分析已经容易多了,装备了智学网、全通等各种网络阅卷系统的学校,如果是网上阅卷,很容易就能够根据自己的需求得到需要的成绩分析报告,平均分最高分,三线一律,分数段分析等等,除了数据还能够给出丰富的图表;也有的考试系统,虽然给出了洋洋洒洒数页的分析报告,但是不能定制,不能提供学科老师关注的成绩分析的点;至于这些成绩分析,能否给出更加详细的知识点掌握情况的反馈,这个不在本文讨论之列,本文只讨论每科最终得分;有的学校是由教务员或者信息技术老师用Excel或者成绩分析软件进行分析,但是多年的成绩数据往往不能够形成数据库,相对来说比较分散。
能够购买网上阅卷系统或者成绩分析软件的学校其实还是少数,大部分都是自己用Excel进行分析,如果是单个班级单个学科,用Excel进行成绩分析并不复杂,但是如果涉及到任教的所有班级、整个年级甚至整个学校,用Excel进行成绩分析的工作就会相当繁重,大大超过了学会python再来进行成绩分析的工作量。所以无论是因为缺乏必要的软件工具,还是用Excel太复杂又或者不能胜任,学习用python来进行成绩分析和处理都是有必要的,无论是对于当前在校的老师还是还在学校的师范生。疫情当前,生活本来就很难,提高工作效率,会有更多的时间放空和养生,毕竟无论什么时候养生都是第一位呢。
当然用python来处理一个年级的成绩,需要所有的成绩表格式一致,不一致的话需要进行预处理也就是所谓的数据清洗,这样写程序会避免写一些额外的代码,毕竟大家都知道代码其实并不智能,你要写的很智能,就要增加非常度的开发量,但是这些开发量可以通过统一格式来避免;有的学校统计成绩用钉钉的在线表格或者金山在线文档,格式会一致,这样就会方便很多;很多高大上的功能,在实际中并不是很重要,甚至我们不处理异常,更多的我们写的是一次性的脚本或者程序,运行一次之后就“丢弃了”,当然了成绩分析这种事,年年有,每个学期有,花费心思定制属于自己的成绩分析软件是值得的,毕竟大部分老的教师职业生涯都要三四十年,从这个角度学习python,在现有软件不能满足需求,学校自己不足的情况下,开发自己的成绩分析软件,用的顺手的软件是很赚的。
事情做多了,手熟了,就会有自己的一套方法,把这套方法用程序表示出来,并渐渐的能够兼容很多乱七八糟的情况,属于自己的软件就成了。从这个角度,我很佩服以前工作的学校的一个体育老师,自己从零开始学习,开发了青岛市运动会管理系统,从这个角度,他比我厉害。
Python库的选择
其实用Python进行成绩分析,Pandas无疑是最强大的,然后才是其他的Excel相关的第三方库,比如xlrd&xlwt、openpyxl、xlxwriter等,但是情境的不同需要选择的库也不同。
xlrd&xlwt
xlrd的作用是读取Excel文件,xlwt是修改Excel文件。不管悲催的是,想要既要读取又修改&吸入Excel,还需要第三方库的支持。相对来说修改并保存Excel的逻辑比较复杂,所以只有仅需读取excel的时候,用xlrd。
openpyxl
这个库不支持2003版本的excel,excel 2010之后的都是支持的,现在一般电脑自带的excel版本都比较新,所以用这个库不会遇到太多的兼容性问题;即便是偏远地区,薄弱校,excel的版本大多是2007或者wps,实在不行,如果真的是excel2003,装个wps也能解决问题。
openpyxl的API设计的比xlrd合理,跟我们日常使用excel的逻辑是一致的,读取并写入excel也很优雅流程,跟我们用excel打开文件,然后保存一样简单。甚至openpyxl还支持公式等操作,但是其实,我们只需要用到数据的读取就好了。
如果是用xlrd&xlwt类似的库来读取写入excel,进行成绩分析,成绩分析的算法需要自行实现,好比你买了一套工具比较少的工具箱,能够满足基本需求,但是高级的需求要自己实现,毕竟只有一把锉刀也可以造锤子,但是如果有机床肯定更加方便。但是如果是用pandas库进行成绩分析,那么就好比从传统木工工具上升到了机床,直接数控开榫,效率大大提高。pandas求总分、平均分,六选三不同组合的分是很简单的,几乎跟用excel公式没有差别,但是相对来说openpyxl稍微麻烦点,pandas处理数据是按照矢量来的,跟openpyxl是不同的。不过对于初学者pandas更加容易理解,就像小孩子在学习小乌龟编程,宁愿复制命令,也不会主动的用循环或者函数简化代码,要么不会,要么掌握的不够熟练。
openpyxl的安装
安装非常简单,只需要在python中的命令行提示符中
python -m pip install openpyxl
或者更简单一点
pip install openpyxl
pandas
pandas无疑是强大的,坦白的讲,我自己也不熟悉,当然这也是我写文章的原因,记录自己学习的过程,健身学习印象。
处理excel
文件的打开和关闭
其实,分析成绩最常见的工作流就是:打开文件,编辑excl文件,保存文件。这个流程用excel来做旧比较简单。
from openpyxl import load_workbook
# 打开excel文件
wb = load_workbook('iamhappy.xlsx')
# 选择第1个工作表sheet
ws = wb.active
# 修改A1单元格的值
ws['A1'] = '苟日新,日日新'
# 保存文件
wb.save('iamhappy.xlsx')
首先从openpyxl
库中导入加载(打开)excel文件要用到的方法(工具)load_workbook
,然后调用,相当于在excel通过打开菜单,打开文件;而wb.active其实就是选择默认激活的工作表,在excel中默认激活的excel一般是第一个,当然你修改了就不是了,这个在处理excel的时候是需要注意的。
这个是用wps创建的默认只有一个sheet,而excel老版本创建的工作簿默认有3个sheet(工作表),现在最新的excel 365也是一个了。而运行
ws = wb.active
就相当于,用鼠标单击了Sheet1
,意味着要在这个工作表中处理数据。
注意我们平时说的excel文件术语是工作簿,也就是英文的worksheet,习惯性缩写为wb;而工作表就是sheet,也就是worksheet这个词,习惯性缩写为ws;日常生活中一般很少用工作簿或者工作表,除非是写书,一般说excel文件和sheet。**还需要注意的是,在excel打开的情况下,python程序无法操纵excel文件的,需要在文件关闭的状态下进行。
文件的修改
打开关闭文件只是准备工作,对数据修改才是核心,也就是数据的插入、修改、删除、复制、计算、格式等操作,我们慢慢讲来。
在这里需要赘述下excel中的基本概念,单元格,单元格的值,单元格的行标和列标,以及单元格的格式,单元格值的修改;然后是行的概念,列的概念,表头;然后是公式;这是一些基础的概念,想要用python处理excel,就要知道在python的第三方库xlrd、openpyxl以及pandas,这些操作是如何完成的,掌握了这些知识,就可以愉快的用python进行数据处理了。所以从这个角度来看,python处理数据其实很简单的。
以前陪朋友去咨询古筝课程,说学习古筝有两种学习方法,一种是为了考级那就非常系统的学习,一种是老头老太太,学会弹奏一两首就行了,这两种学习目的不同的人,教学方式也不同,就像有人看了陈情令,买了笛子就只想学会不羁是一样的。
单元格值的读取和修改
可以说无论是什么水平的excel使用者,大部分时间都花在了跟单元格打交道上,夸张点说,只要我们知道了如何读取单元格,如何设置、修改单元格的值,我们就已经可以使用excel了,同样可以用python处理excel了,因为无非是python读取数据,编写处理数据处理的程序,然后把处理的结果输出到excel,所以学会处理excel的值是最重要的。
而openpyxl的API显然是经过了非常良好的设计,可以方便的读取工作簿(英文单词是哪个?)中工作表中的单元格的值。
日常使用excel的时候,描述一个单元格,往往会说B4
单元格,在excel中,行的序号是字母以及字母的组合,列的序号是阿拉伯数字。而openpyxl库的作者利用python提供的一些魔术方法,使得我们在用这个库访问excel单元格的数据的时候,跟我们日常习惯相同。所以从语法上看ws["A1"]
是在访问字典ws中键为A1的元素,实际上,得益于魔术方法,访问的是ws中第1列第1行的数据,ws在openpyxl中,可以看做是一个具有二维数组特性的类,当然扩展了很多属性,这种实现是很妙的,得益于python良好的语言架构,如果你读过《流畅的Python》这本书就更能领会优雅精妙之处了,由于python提供的魔术方法,我们可以像操作python自带的数据结构一样操作自定义的类,比如这个中括号运算,真的是非常的方便了。
既然知道了怎么修改了,其实读取值也是一样的,还是ws["A1"].value
或者ws["B4"].value
,如果想要输出单元格的值,只要
from openpyxl import load_workbook
# 打开excel文件
wb = load_workbook('iamhappy.xlsx')
# 选择第1个工作表sheet
ws = wb.active
# # 修改A1单元格的值
# ws['A1'] = '苟日新,日日新'
# 读取单元格的值
print(ws["A1"].value)
# 保存文件
wb.save('iamhappy.xlsx')
小结
所以到这里,我们已经理解了如何打开、保存excel,读取和修改单元格的值,这就可以用excel处理需求了,可以这是用python处理excel数据需要学习的最简单的技巧了。写这些一方面是想学习,一方面也是打发时间,还有一些说不清道不明的原因,反正就是写点总比不写好。虽然我打算写的是针对学校场景中的信息技术老师、教务员以及想用python分析成绩的学科老师的内容,但是其他应用场景下的无产阶级兄弟们也是可以学习借鉴,只不过力求通俗(懒)所以写的很是臃肿啰嗦,近乎于培训讲座的逐字稿。
练习
你可以试着安装下openpyxl库,然后用openpyxl打开(这里不用读取用打开其实是为了与日常使用excel的体验一致)一个已有的excel文件,
- 读取单元格的数据,用
print
函数打印出来,显示在命令行中; - 修改excel中某个单元格的值
- 打开一个成绩表,求几个学生的总分,当然所有学生的总分需要用到循环