一、引言
相信很多大学生朋友们都经历过综合测评。每次综合测评的时候都要计算班上同学成绩的加权平均分(或绩点),可能会有些学校会直接给出结果,然而有些学校并不会。这时就需要班上的负责人进行计算,这可是件比较麻烦的事情。这时我就想到,能不能用编程解决这类问题呢?
“为什么开学初进行的综合测评直到现在才发攻略呢??”
“因为懒。”
二、准备工作
由于作者学校的期末成绩是由Excel表给出的,所以在Python程序中需要对Excel表进行读写操作。这时我们需要导入两个包,一个是xlrd(用来读Excel),另一个是xlwt(用来写Excel)。
这两个包一般情况下来说不是自带的,需要自行下载安装,我是用pip安装的,比较方便。
接下来我们再来观察一下成绩单Excel表的特点(嘤嘤嘤 要暴露自己的成绩了):
(俗话说得好,世界上有10种程序员,一种是从0开始数数的,一种是从1开始数数的。为了编程讲解方便,我就做第0种程序员吧)
第0列学院名
第1列专业名
第2列班级名
第3列学生姓名
第4列学号
第5列学期数
第6列课程号
第7列课程名
第8列课程学分
第9列课程成绩
知道了每列的内容之后,我们可以开始干活了。
三、开始干活
整个过程大概分成三步:第一步,读取成绩信息;第二步,计算加权平均数结果;第三步,将结果存入新的Excel表中。
1. 读取成绩信息
首先我们打开成绩单的Excel表:
book = xlrd.open_workbook("/home/xu/学习/Python/综合测评/成绩单1.xlsx")
# 打开Excel文件
sheet1 = book.sheet_by_index(0)
# 打开索引号为0的表 这个索引号就是打开Excel之后左下角的那个玩意的序号 并非名称
因为成绩是按照学生的姓名进行统计的,所以我使用Python中的字典数据类型来保存学生的成绩信息。格式如下:
stu[‘学生姓名’]=[[‘第0门课程学分’ , ’成绩’] , [‘第1门课程学分’ , ’成绩’] , ... , [‘第n门课程学分’ , ’成绩’]]
接着我们逐行读取Excel表中的数据:
for i in range(sheet1.nrows):
row = sheet1.row_values(i)
if row[3] not in stu.keys():
stu[row[3]] = [row[8:10]]
else:
stu[row[3]].append(row[8:10])
从第三行if判断语句可以看出代码的大致思路是每读取一行数据后,判断学生姓名是否已在字典的键名中。若未出现,则创建记录,若已出现,则直接append。
这里还有一种情况,有些学校计算加权平均分的时候不是所有选修的课程都计算在内的,而是只计算专业课的分数,而上述的代码显然没有考虑到这种情况。这时我们可以在第三行if条件判断语句之外再加上一个判断条件(意思就是原本的三到六行都要写在新的条件判断语句之内),判断该课程是需要算分,可以用一个list保存需要算分的科目的课程号,然后用in进行判断,易得。
(其实我是先用Excel自带的筛选功能先把专业课挑出来的(手动滑稽))
2. 计算加权平均数结果
for name in stu:
credit = 0 # 总学分
total = 0 # 学分乘成绩的和
for x in stu[name]:
credit += x[0]
total += x[0]*x[1]
stu_grade.append([name,total/credit])
stu_grade变量里存的就是学生的姓名和最后的加权平均分,格式如下:
stu_grade[i] = [‘第i个学生的姓名’ , ’加权平均分’]
在这里,有些学校计算的是学分,只要在第六行total += x[0]*x[1]之前加上条件判断就行了,易得。
3. 将结果存入新的Excel表中
和打开Excel表类似,不再赘述。
book = xlwt.Workbook(encoding = 'utf-8')
# 打开Excel文件
sheet = book.add_sheet("sheet1")
# 打开索引号为0的表 这个索引号就是打开Excel之后左下角的那个玩意的序号 并非名称
for i in range(len(stu_grade)): # 逐行写入
sheet.write(i,0,stu_grade[i][0])
sheet.write(i,1,stu_grade[i][1])
book.save("test.xls") # 保存
四、感想
1. 我当时给变量命名的时候命的是什么鬼名字。(代码是九月份就写好的,文章是刚写的,因为懒,所以代码也没改)
2. 我大三分数好低。
3. 我都大四了以后都用不到了想想还有点小失落呢。
附Python完整代码如下:
#coding:utf-8
import xlrd # 读excel
import xlwt # 写excel
book = xlrd.open_workbook("/home/xu/学习/Python/综合测评/成绩单1.xlsx")
sheet1 = book.sheet_by_index(0) # 打开索引号为0的表
stu = {}
stu_grade = []
# 读取学生姓名、每门课程的学分以及每门课程的成绩
for i in range(sheet1.nrows):
row = sheet1.row_values(i) # 逐行读取
#print(row)
if row[3] not in stu.keys():
stu[row[3]] = [row[8:10]]
else:
stu[row[3]].append(row[8:10])
# 计算加权平均数
for name in stu:
credit = 0 # 总学分
total = 0 # 学分乘成绩的和
for x in stu[name]:
credit += x[0]
total += x[0]*x[1]
stu_grade.append([name,total/credit])
# 写入新的excel表
book = xlwt.Workbook(encoding = 'utf-8')
sheet = book.add_sheet("sheet1")
for i in range(len(stu_grade)):
sheet.write(i,0,stu_grade[i][0])
sheet.write(i,1,stu_grade[i][1])
book.save("test.xls")
# print(stu_grade)