助教工作:关于如何使用python+excel快捷生成千帆竞发图
为什么需要这样的功能
生成千帆竞发图需要数次作业成绩列在一张总成绩表中,通过人工的方式将复数张表合并为一张效率实在底下。
而合并的操作本身却是规律性极强、重复性极强的,这通常意味着:我们可以利用程序来代替人工,从而提高效率,让我们把时间放到做更有意义的事情上去。
所以为了提高助教工作的效率,决定制作这样的一个python程序来快速生成总成绩表,然后使用excel自带的图标功能来生产千帆竞发图。
码云地址
https://gitee.com/weberpyth/python-script-set/tree/master/work/nsi/script/homework_Excel_craft
准备
python 3.5+
excel 2010 及以上
博客园班级导出作业excel功能
安装
需要安装python的第三方库xlrd,xlwt
使用pip安装即可,指令如下
pip install xlrd
pip install xlwt
数据处理思路
在博客园可以通过作业的导出excel功能快速获取某次作业的成绩。
以下是由博客园导出的某次作业的成绩
我们发现:在导出的数据中,学号是具有唯一性的,通过按学号提取多次作业的成绩,可以形成学号-历次成绩列表的映射,形如
'201879123761xxx':[9,8,...,14]
而且通过学号归纳成绩,可以避免粗暴的提取列造成的一些错误。
代码及方法
首先引入所需的库,以及声明的全局变量Data
import xlrd,sys,os,xlwt
Data = {}
然后设置读取函数,引入全局变量Data,读取过程中将学号作为字典的key,而字典的value则是list类型的数据,将各个表同样位置上的成绩依次录入到对应的list中
def dataReader(sheet):
global Data
for i in range(1,sheet.nrows):
try:
Data[sheet.row_values(i)[0]].append(sheet.row_values(i)[5])
except:
Data[sheet.row_values(i)[0]] = [ sheet.row_values(i)[5] ]
设置写入函数,处理全局变量Data中的数据,将其写入到另一个excel表中
def dataWriter():
global Data
workbook = xlwt.Workbook(encoding = 'utf-8')
worksheet = workbook.add_sheet('Final')
worksheet.col(0).width = 4000
worksheet.write(1,0, label = '学号')
row = 2
for k in Data.keys():
worksheet.write(row,0, label = k)
for i in range( len(Data[k]) ):
worksheet.write(row,i+1, label = Data[k][i])
row += 1
workbook.save('final.xls')
至此,程序的静态部分完成。
为了方便起见,程序从命令行启动时可以接收不定长的参数,这些参数就是各次成绩数据表的文件名。需要使用sys.argv来访问命令行启动时程序接受的参数
books = []
for i in range(1, len(sys.argv) ):
print("正在加载: {}".format(sys.argv[i]))
books.append(sys.argv[i])
print("\n")
调用读取函数来依次处理表中的数据
for i in books:
print("正在处理: {}".format(i))
book = xlrd.open_workbook(i)
sheet = book.sheets()[0]
dataReader(sheet)
print("{} 处理完成!\n".format(i))
最后调用写入函数来保存结果
print("正在链接并生成表格")
dataWriter()
print("完成!\n")
print("按回车结束...")
input()
在制作完这个简单的程序之后,需要我们去启动它。使用方法很简单,命令行启动,命令行参数为各次作业的excel文件。在这需要提醒,请务必将导出的excel文件更名为由数字或英文组成的文件名。对于历次作业,我们需要按照时间顺序输入参数
现在,已经获得了一个由数次作业合并的总体成绩表了。下一步则是生成千帆竞发图
生成千帆竞发图
对于生成出的总体成绩表,仍然需要一些处理。首先是将所有的成绩为NULL的分数,替换为0分
ctrl+F 调出查找界面,选择替换。查找内容为NULL,替换内容为0,选择全部替换