用Python写个自动批改作业系统!
哎我跟你说,我昨晚在客厅地上盘着腿写代码,手里还端着一杯凉掉的奶茶…结果越写越上头,你们有没有这种时候,就是明明下班了但脑子突然灵光一闪…于是我就搞了个小东西,自动批改作业的那种,用 Python 写的,简单粗暴但还挺好玩。
当时是因为我们组那个小李,他妹在补课班,每天堆一堆英语、数学的小题,要人工对答案,他就抱怨得不行。我听着听着就觉得这玩意其实完全可以自动化嘛,对吧…我就随口说“我写一个给你用”,结果小李直接把练习册甩过来,我当时懵了,哎算了都说出口了只能硬着头皮干。
我先说啊,这东西不是那种高大上的 AI 阅卷系统,就是那种最朴素的批改:给你一堆题、标准答案、学生答案,自动比对,然后出报告。你们应该知道吧,就是那种老师天天要干到凌晨的玩意。
代码我那时候边吃零食边敲的,有点乱,你们凑合看:
import jsondefload_answers(standard_file, student_file):
with open(standard_file, 'r', encoding='utf-8') as f:
std = json.load(f)
with open(student_file, 'r', encoding='utf-8') as f:
stu = json.load(f)
return std, stu
defgrade(std, stu):
result = []
score = 0
for qid, answer in std.items():
stu_ans = stu.get(qid, None)
is_correct = (stu_ans == answer)
result.append({
"id": qid,
"your_answer": stu_ans,
"correct_answer": answer,
"correct": is_correct
})
if is_correct:
score += 1
return score, result
defsave_report(score, result, out_file="report.json"):
data = {
"score": score,
"detail": result
}
with open(out_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 举个例子
if __name__ == "__main__":
std, stu = load_answers("standard.json", "student.json")
score, detail = grade(std, stu)
save_report(score, detail)
print("完成,分数:", score)
我跟你讲,这段代码就是那种…怎么说呢…能跑但不优雅,不过对小李他妹那点练习题已经绰绰有余了。那天我在公司楼下抽烟的时候给他演示了一下,他直接“卧槽还能这样”,我心想这玩意不是挺普通的吗…
后来我又顺手给它加了点功能,比如有些题学生会写成“ A ”这种两边带空格的,我帮他规整一下,不然对不上:
defnormalize(ans):
if ans isNone:
returnNone
return ans.strip().lower()# 比对的时候
stu_ans = normalize(stu.get(qid))
answer = normalize(answer)
还有就是那种主观题…哎主观题我真懒得搞,你们懂的,用 NLP 那一套也不是不能做,但我当时晚上十一点多困得要死,就写了个最原始的关键字匹配:
defsubjective_match(std, stu):
ifnot stu:
returnFalse
return std in stu
这个就是…能用但很垃圾那种,不过小题还是够用,小李说老师比这个还随缘,我听了直接笑出来。
然后我想着既然玩都玩了,不如让它跑完之后给学生输出一个“错误点分析”,这样看起来更像个系统,不然太寒酸了:
defanalyze(detail):
wrong = [d for d in detail ifnot d["correct"]]
return {
"wrong_count": len(wrong),
"wrong_items": [w["id"] for w in wrong]
}
运行的时候就是:
score, detail = grade(std, stu)
analysis = analyze(detail)
print(analysis)
输出那种:
{'wrong_count': 3, 'wrong_items': ['3', '7', '9']}
当时我给小李看,他说:“这也太像学校系统了吧”…我说你那补课班收费那么贵,做不到这个还不如我这个三分钟写的脚本。
啊对了,有一次我忘记加异常处理,学生 JSON 格式写错,直接给我炸进程了,我当时正吃泡面差点呛到:
try:
std, stu = load_answers("standard.json", "student.json")
except json.JSONDecodeError:
print("文件格式出错了,别乱加逗号……")
你们写的时候记得把这种坑补一下,这玩意要是给别人用,最好别随随便便崩。
反正总之吧,这个小工具其实特别实用,不管是不是给学生用,你要是有那种“成批比对数据”的需求,稍微改一改都能用——比如对 API 返回结果、对模型预测结果、对爬虫数据,随便你折腾。
哎我先不说了,小李在旁边喊我帮他加个统计图的功能,我说我又不是你家私人工具人…算了算了我去搞一下,你们要是想加别的功能再喊我。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB。