[toc]
## 效果预览
#### 生成测试文件
![](https://box.kancloud.cn/a76b3001efdeee4f5d14301069021c80_436x632.png)
#### 文件内容
![](https://box.kancloud.cn/7b52b07e56f9aefed72bdf5e09b8ad64_296x435.png)
#### 同学填写完后的内容
![](https://box.kancloud.cn/aba6573dde0e0abf67a3c57e6917836e_405x559.png)
#### 批改单词
![](https://box.kancloud.cn/28aec9f13219c172883fe19db5df9766_440x960.png)
#### 单词批改结果
![](https://box.kancloud.cn/a4967d546f848bffa49f563bc02203cf_709x898.png)
## 升级信息
相比于 1.0, 升级如下:
1. 支持并行操作, 1.0 版本一次只能一个同学, 一次提问`10`个单词/次, 共计耗时`45`分钟.
2. 2.0 版本, 可以所有同学同时进行, `50`个单词/次, 共计耗时`20`分钟.
3. 1.0 版本需要很多支持, php, 数据库, apache, layui. 2.0 版本只需要两个, python 和 svn
4. 使用方便, 直接运行 python 文件即可
## 文件说明
1. `index.py` 生成单词测试文件, 每个同学 50 个单词, 相邻同学的单词各不相同.
2. `check.py` 单词批改文件, 可以生成批改结果`checkRes.txt`文件
3. 通过 svn 把测试文件发给同学们, 同学们写完之后, 通过 svn 提交
4. 每天的批改结果(`checkRes.txt`), 也可以通过 svn 分享给大家
## 使用方式
1. `python index.py`, 生成单词测试文件
2. 通过 svn 共享给同学们
3. 同学们完成单词并提交
4. 老师更新 svn 并批改(`python check.py`)
5. 把批改的文件加上当天日期, 通过 svn 发给同学们
## Python 源码
#### index.py
```python
# coding=utf-8
import random
words = [
'compare',
'Fn',
'interchange',
'standard',
'information',
'info',
'ASCII',
'parse',
'Integer',
'Float',
'function',
'extension',
'language',
'default',
'browser',
'variable',
'console',
'arguments',
'break',
'catch',
'class',
'constant',
'continue',
'type',
'unexpected',
'document',
'identifier',
'model',
'current',
'computed',
'plus',
'multiply',
'snippet',
'prefix',
'description',
'result',
'divide',
'square root',
'math',
'method',
'minus',
'param',
'length',
'concat',
'separator',
'shift',
'insert',
'slice',
'sort',
'splice',
'lower',
'pretty',
'format',
'negative',
'negative infinity',
'upper',
'Infinity',
'brown',
'lazy',
'reference',
'positive',
'positive infinity',
'statement',
'syntax',
'score',
'illegal',
'property',
'defer',
'instance',
'global',
'static',
'declare',
'active',
'clipboard',
'declaration',
'hoisting',
'factorial',
'range',
'maximum',
'call',
'stack',
'queue',
'heap',
'exceeded',
'overflow',
'prompt',
'confirm',
'tick',
'interval',
'timeout',
'uniform',
'resource',
'collection',
'foreach',
'area',
'map',
'rectangular',
'coords',
'undescribable',
'ignore',
'Iterator',
'split',
'toggle',
'previous',
'prev',
'equal',
'attribute',
'odd',
'even',
'visible',
'onload',
'device-width',
'viewport',
'initial-scale',
'compatible',
'filter',
'query',
'next',
'parent',
'meta-information',
'index',
'remove',
'append',
'prepend',
'scroll',
'create',
'resize',
'cursor',
'pointer',
'offset',
'target',
'trigger',
'event',
'client',
'hover',
'display',
'fadeIn',
'fadeOut',
'slide',
'fade',
'detach',
'sibling',
'wrap',
'unwrap',
'serialize',
'animate',
'swing',
'linear',
'delegate',
'undelegate',
'compress',
'container',
'task',
'item',
'vertical',
'align',
'current',
'focus',
'outline',
'drop',
'shadow',
'drop-shadow',
'transition',
'delay',
'inset',
'keypress',
'keyCode',
'storage',
'local',
'localStorage',
'stringify',
'through',
'decoration',
'text-decoration',
'line-through',
'content',
'notation',
'collection',
'an ordered list',
'associative',
'associative array',
'record',
'struct',
'dictionary',
'hash',
'employees',
'tips',
'stopPropagation',
'preventDefault',
'entry/entries',
'search',
'find',
'regular',
'expression',
'match',
'replace',
'create',
'update',
'retrieve',
'delete',
'alter',
'pattern',
'engine',
'primary',
'unique',
'column',
'affected',
'average',
'count',
'distinct',
'descend',
'desc',
'repository',
'initialize',
'status',
'difference',
'graph',
'staged',
'remote',
'master',
'untracked',
'branch',
'bugFix',
'merge',
'issue',
'stash',
'feature',
'secure',
'safe',
'path',
'set',
'warning',
'mixed',
'label'
]
words = list(set(words))
students = [
'耿泽阳',
'尚国强',
'吴雨阳',
'贾方园',
'岳风华',
'邱俊鸽',
'赵海成',
'姚林佳',
'周鑫鑫',
'李宏刚',
'路宽阔',
'徐晓航',
'康瑞植',
'李亚南',
'宋姝莹',
'刘余先',
'徐帅',
'成龙龙',
'孙岩涛',
'周萧',
'郑彬彬',
'耿富源',
'李攀登'
]
new_words = []
for i in students:
file_obj = open(i+".txt", 'w+')
student_words = []
while len(student_words) < 50:
if not len(words):
words = new_words
new_words = []
y = random.randint(0, len(words)-1)
if words[y] not in student_words:
if len(student_words) is 49:
file_obj.write(words[y]+' ===> ')
else:
file_obj.write(words[y]+' ===> '+"\n")
new_words.append(words[y])
student_words.append(words[y])
words.remove(words[y])
file_obj.close()
print("\"%s\" 同学的单词列表, 已经生成!" % i)
```
#### check.py
```python
# coding=utf-8
import chardet
import os
word_dict = {
'compare': '比较/对比/代码对比/代码比较',
'fn': '函数缩写/function缩写/方法缩写',
'interchange': '交换',
'standard': '标准/标准化',
'information': '信息',
'info': '信息缩写/information缩写',
'ascii': '美国信息交换标准代码',
'parse': '分析/解析',
'integer': '整数/整型/整型',
'float': '浮点数/浮动',
'function': '函数/方法',
'extension': '扩展/插件',
'language': '语言',
'default': '默认',
'browser': '浏览器',
'variable': '变量/可变的',
'console': '控制台',
'arguments': '参数',
'break': '中断',
'catch': '捕获',
'class': '类',
'constant': '常量/常数',
'continue': '继续/跳过当前循环',
'type': '类别/类型',
'unexpected': '不符合期望的/未符合期望的',
'document': '文档',
'identifier': '标识符',
'model': '模型',
'current': '当前的',
'computed': '计算/经过计算的',
'plus': '加法/相加',
'multiply': '乘法/相乘',
'snippet': '代码段',
'prefix': '前缀',
'description': '描述/描写',
'result': '结果',
'divide': '除法/相除',
'square root': '开方/开平方根',
'math': '数学',
'method': '方法/函数',
'minus': '减法/相减',
'param': '参数',
'length': '长度/数组长度/字符串长度',
'concat': '合并',
'separator': '分隔符',
'shift': '移位/移出/移除/删除',
'insert': '插入',
'slice': '切片/数组切片/字符串切片',
'sort': '排序/排列',
'splice': '拼接/接合',
'lower': '小写',
'pretty': '可爱的',
'format': '格式化',
'negative': '消极的',
'negative infinity': '负无穷',
'upper': '大写',
'infinity': '无穷/无限',
'brown': '棕色的',
'lazy': '懒惰的',
'reference': '引用',
'positive': '积极地',
'positive infinity': '正无穷',
'statement': '语句',
'syntax': '语法',
'score': '分数/得分/成绩',
'illegal': '非法的',
'property': '属性',
'defer': '延迟',
'instance': '实例',
'global': '全局的',
'static': '静态/静态的',
'declare': '声明',
'active': '活动的/积极地/活跃的',
'clipboard': '剪切板/粘贴板/剪贴板',
'declaration': '声明',
'hoisting': '提升',
'factorial': '阶乘',
'range': '范围/幅度',
'maximum': '最大值',
'call': '调用',
'stack': '栈',
'queue': '队列',
'heap': '堆',
'exceeded': '超越/超过/超出/越出',
'overflow': '溢出',
'prompt': '提示',
'confirm': '确认',
'tick': '滴答/滴答声',
'interval': '间隔/间距',
'timeout': '超时/延迟',
'uniform': '统一/统一的',
'resource': '资源',
'collection': '收集/集合',
'foreach': '循环/数组循环/数组遍历/遍历数组',
'area': '区域/面积/范围',
'map': '映射',
'rectangular': '矩形/矩形的',
'coords': '坐标',
'undescribable': '不可描述的/难以描述的',
'ignore': '忽视/忽略',
'iterator': '迭代器',
'split': '分割/分解/',
'toggle': '开关/切换',
'previous': '上一个/前一个',
'prev': '上一个的缩写/前一个的缩写/previous的缩写/前一个缩写',
'equal': '相等',
'attribute': '属性',
'odd': '奇数的',
'even': '偶数的',
'visible': '可见的/可见性',
'onload': '装载/加载',
'device-width': '设备宽度',
'viewport': '观察口/视窗口/浏览器视窗',
'initial-scale': '初始缩放值/初始缩放值',
'compatible': '兼容性/兼容的',
'filter': '过滤器',
'query': '查询',
'next': '下一个/下个',
'parent': '父级/上层/上级',
'meta-information': '元信息',
'index': '索引',
'remove': '移除/删除',
'append': '追加/后加/后插/附加',
'prepend': '前面追加/前加/前插',
'scroll': '滚动/卷轴/屏幕滚动',
'create': '创造/新建',
'resize': '调整大小/设置大小',
'cursor': '光标/游标',
'pointer': '指针',
'offset': '位移/移位',
'target': '目标',
'trigger': '触发器/扳机',
'event': '事件',
'client': '客户端/机',
'hover': '悬停/悬停',
'display': '展示/显示',
'fadein': '淡入',
'fadeout': '淡出',
'slide': '滑动',
'fade': '平淡的',
'detach': '分离',
'sibling': '兄弟姐妹/同胞/兄弟姊妹',
'wrap': '包裹/包装',
'unwrap': '打开/解包装',
'serialize': '串行化/字符串化',
'animate': '动画',
'swing': '振幅',
'linear': '线性的',
'delegate': '代理/事件委托',
'undelegate': '阻止代理/阻止事件委托',
'compress': '压缩',
'container': '容器',
'task': '任务/工作/作业/项目',
'item': '项目/一项',
'vertical': '垂直的',
'align': '对齐',
'current': '当前',
'focus': '焦点/使聚焦',
'outline': '轮廓',
'drop': '下落',
'shadow': '阴影',
'drop-shadow': '下落式阴影',
'transition': '过渡/转变/转换',
'delay': '延迟/延期/推迟/',
'inset': '嵌入式/插入/内阴影',
'keypress': '按键响应/键盘事件',
'keycode': '键码/按键序列号/按键值',
'storage': '存储/缓存',
'local': '本地',
'localstorage': '本地存储/本地储存/本地缓存',
'stringify': '字符串化',
'through': '穿过/透过',
'decoration': '装饰/修饰',
'text-decoration': '文本装饰/文本修饰',
'line-through': '删除线/中划线',
'content': '内容',
'notation': '表示法',
'collection': '集合',
'an ordered list': '有序列表',
'associative': '关联',
'associative array': '关联数组',
'record': '记录',
'struct': '结构',
'dictionary': '字典',
'hash': '哈希表',
'employees': '雇员/员工',
'tips': '贴士/提示框',
'stoppropagation': '停止冒泡/阻止冒泡',
'preventdefault': '阻止默认事件/阻止默认行为',
'entry/entries': '进入/入口/项目',
'search': '查找/查询/搜索/搜寻/搜查',
'find': '查找/查询',
'regular': '正则',
'expression': '表达式',
'match': '匹配/相配',
'replace': '替换/更换',
'create': '新增/新建/增加',
'update': '更新',
'retrieve': '读取/查询',
'delete': '删除',
'alter': '改变/更改',
'pattern': '匹配模式',
'engine': '数据库引擎 ',
'primary': '主要的',
'primary key': '主键',
'unique': '唯一性',
'column': '列/字段',
'affected': '受影响的',
'average': '平均/平均数',
'count': '计数',
'distinct': '不同的(用于去重)/数据去重',
'descend': '下降',
'desc': '降序排序',
'repository': '仓库',
'initialize': '初始化',
'status': '状态',
'difference': '差异',
'graph': '图形',
'staged': '(已放入)暂存区',
'remote': '远程',
'master': '主要的',
'untracked': '未追踪/未跟踪',
'branch': '分支',
'bugfix': 'bug修复',
'merge': '合并',
'issue': '问题',
'stash': '暂存/隐藏',
'feature': '功能/特性',
'secure': '安全的',
'safe': '安全',
'path': '路径',
'set': '设置',
'warning': '警告',
'mixed': '混合(类型)',
'label': '标签',
'notice': '提示'
}
students = [
'耿泽阳',
'尚国强',
'吴雨阳',
'贾方园',
'岳风华',
'邱俊鸽',
'赵海成',
'姚林佳',
'周鑫鑫',
'李宏刚',
'路宽阔',
'徐晓航',
'康瑞植',
'李亚南',
'宋姝莹',
'刘余先',
'徐帅',
'成龙龙',
'孙岩涛',
'周萧',
'郑彬彬',
'耿富源',
'李攀登'
]
resObj = open('checkRes.txt', 'w+', encoding='utf-8')
for student in students:
check_str = ""
wrong_words = 0
total_words = 0
final_res = ""
not_enough = ""
white = ""
good = ""
if not os.path.exists(student+'.txt'):
print('\n天哪!!! \"'+student+"\" 同学, 你还没有交啊...\n\n")
else:
encoding1 = chardet.detect(open(student+".txt", "rb").read())['encoding']
# print(encoding1)
fileObj = open(student+'.txt', "r", encoding=encoding1)
for word_line in fileObj.readlines():
if "===>" in word_line:
total_words = total_words+1
tmpList = word_line.split('===>')
current_en = tmpList[0].strip()
current_zh = tmpList[1].strip()
if current_zh:
if current_zh[-1] == "的" or current_zh[-1] == "地" or current_zh[-1] == "得":
current_zh = current_zh[:-1]
word_real = word_dict[current_en.lower()]
if current_zh not in word_real or not current_zh:
wrong_words = wrong_words+1
check_str = check_str+current_en+" ===> "+current_zh+" ===> "+word_real+"\n"
if total_words < 50:
not_enough = "\n什么情况?"+str(total_words)+"个? 单词量不够啊?"
if wrong_words == total_words:
white = "\n天哪, 你这是交了白卷吗?\n\n"
if not wrong_words and total_words:
good = "\n全对了, 太牛逼了!!!\n\n"
final_res = "\""+student+"\" 同学的单词成绩:"+str(total_words-wrong_words)+"/"+str(total_words)+"\n\n"
print(final_res)
final_res = final_res+check_str
if not_enough:
final_res = final_res+not_enough
if white:
final_res = final_res+white
if good and not not_enough:
final_res = final_res+good
resObj.write(final_res+"\n")
resObj.close()
```