需求:
作为双语教学的老师,学科单词一直是教学的重要一关
之前抽测学生都是用的自己做的word模板,打印出来一张纸上能切成三个人的试题:
类似的表格,打出来就是三个人的考试题
但是久而久之有的班级监管不力的话抄袭的现象也会出现,而如果针对每个人调换顺序的话工作量太大,可操作性和扩展性也太弱。
而且手头有这样的单词表(excel格式),于是动了python批处理脚本自动生成的心思
目标是生成有每个人名字,并且每个人的抽测单词是从单词表里随机抽出的。
手头的资源:
类似的单词表,有几百个词
学生名单:
开工:
因为需要用python最后输出word方便打印,参考网上使用了python-docx库
使用pip安装docx库(win使用cmd输入命令,mac使用终端terminal输入):
pip install python-docx
docx库使用方法参见了这两部分:
python-docx 使用教程www.cnblogs.com https://python-docx.readthedocs.io/en/latest/python-docx.readthedocs.io
然后为了便于操作,将现有的单词表和名单都存为csv格式
思路大致如下:
野路子自学。。流程图的规范忘的差不多了。。
开始码字:
#引入所用库:
from docx import Document
import random
import csv
#声明一下变量
voca_en = []
voca_cn = []
names = []
#读单词表文件(已存为voca.csv),将每一行的第一列(英文单词)增加入voca_en列表,第二列(中文意思)增加入voca_cn列表
csv_voca = csv.reader(open('voca.csv',encoding='utf-8'))
for row in csv_voca:
voca_en.append(row[0])
voca_cn.append(row[1])
#读取名单数据(存为G81.csv),将名字存入names列表中
csv_names = csv.reader(open('G81.csv',encoding='utf-8'))
for row in csv_names:
names.append(row[0])
#新建一个word文档对象,名为doc
doc = Document()
#开始一个一个提取名字,并写在前面成为一段
for name in names:
nametitle = doc.add_paragraph()
nametitle.add_run('Name:' + name)
#(仍在循环内)画一个2列10行的空表格,样式为"所有边框"
table = doc.add_table(rows=10, cols=2,style='Table Grid')
#(仍在循环内)把中文意思的列表复制一下(直接用voca_cn_test = voca_cn赋值语句只会在内存中的这个列表赋予两个名称,一会不放回取出的时候实际voca_cn也会同等收到影响,必须另外复制一个完全独立的才行)
voca_cn_test = list(voca_cn)
#(仍在循环内)开始不放回随机抽取单词(中文意思),使用的是列表的pop方法;每次取出之后待抽单词列表的长度都会变化,所以随机数的取值范围也要时刻更新
for a in range(0,10):
cell= table.cell(a,0)
x = random.randrange(len(voca_cn_test)-1)
print(len(voca_cn_test))
cell.text = voca_cn_test.pop(x)
#(仍在循环内)为了好看,每循环完成一个人的单词表,就在shell里面提示一下(删去无影响)
print('finished quiz:'+ name)
print('==================================')
#最后所有人名都完成了循环,需要将这个docx文件保存一下(运行过程中一直都在内存中,保存后才能看得到)
doc.save('quiz.docx')
跑一遍看看效果
基本完成了预想的样子,格式什么为了方便打印还需要调整一下(比如名字离上一个人的quiz太近了,打印出来不好裁剪),不过都还比较好搞。
还有很多不足,比如语句冗余还是很多;方法应该还有更高效的,不过目前的数据量较小基本不用考虑运行时间问题。
下一步的升级希望能和学生的成绩水平挂钩,根据平常类似单词考试的成绩来提高或者降低难度(通过调整汉译英和英译汉的比例),简单来说可以直接拿平时成绩的分数换算为汉译英/英译汉的比例从而调整抽提,更深的学生成绩数据存储可能需要数据库知识了吧,还需要恶补。