前面的课程中,我们已经掌握了读取学生答题卡中学号的方法。
接下来,我们将用类似的方法逐行读取填空题答案,并通过判断学生答案与标准答案是否一致来计算分数。
乔老师将填空题的标准答案存储在了standardTwo的列表中。我们可以通过列表的索引依次获取每道题的标准答案。比如,填空题第一题的标准答案就可以使用standardTwo[0]来进行读取。 |
|
修改后的完整代码 # 使用import导入os模块 import os # 使用import导入docx import docx # 第二大题填空题标准答案 standardTwo = ["东临碣石", "行舟绿水前", "孤山寺北贾亭西", "断肠人在天涯", "故人具鸡黍", "一曲新词酒一杯", "何当共剪西窗烛", "误入藕花深处", "烟笼寒水月笼沙", "万籁此都寂", "初日照高林", "腾蛇乘雾"] # 输出填空题第一题的标准答案 print(standardTwo[0]) # 将乔老师的答题卡文件夹路径 /Users/qiao/answerKey 赋值给变量allKeyPath allKeyPath = "/Users/qiao/answerKey" # 使用os.listdir()函数获取该路径下所有的文件,并赋值给变量allItems allItems = os.listdir(allKeyPath) # 定义一个空列表allStudentsData存储所有学生数据 allStudentsData = [] # 使用for循环逐个遍历所有学生答题卡 for item in allItems: # 定义一个空字典studentData存储单个学生数据 studentData = {}
# 使用os.path.splitext()函数获取文件名的前半段,并赋值给变量fileName fileName = os.path.splitext(item)[0] # 使用split()函数以"-"分隔文件名,将第1部分班级信息赋值到学生数据字典的classInfo键里 studentData["classInfo"] = fileName.split("-")[0] # 使用split()函数以"-"分隔文件名,将第2部分姓名信息赋值到学生数据字典的name键里 studentData["name"] = fileName.split("-")[1]
# 使用os.path.join()函数拼接出答题卡路径,并赋值给变量keyPath keyPath = os.path.join(allKeyPath, item) # 读取答题卡并赋值给变量doc doc = docx.Document(keyPath)
# 读取第四段学号段,并赋值给变量idPara idPara = doc.paragraphs[3] # 读取学号段中第二个样式块,并赋值给变量idRun idRun = idPara.runs[1] # 读取学号,并赋值到学生数据字典的id键里 studentData["id"] = idRun.text # 使用append()函数 # 将studentData添加到总学生数据allStudentsData中 allStudentsData.append(studentData) |
通过第一节课的定位,我们知道学生的填空题答案开始于答题卡中的第9段,可以使用doc.paragraphs[8]读取该段落对象。
然后访问该段落对象的第2个样式块的文本内容:doc.paragraphs[8].runs[1].text,来读取学生的答案。
也就是说,第一题的标准答案需要用列表的索引0获取,学生答案需要用索引8获取到段落对象。以此类推,只要用标准答案的索引加8,就可以得到对应的学生答案所在的段落索引。比如,第2题在标准答案的列表里的索引是1,那么对应的学生答案的段落索引则是1+8=9。
要判断学生答案是否正确,需要在获取标准答案和学生答案后,将它们一一进行对比。接下来,我们会分别介绍两种方法~
第一种方式: |
# 使用import导入os模块 import os # 使用import导入docx import docx # 第二大题填空题标准答案 standardTwo = ["东临碣石", "行舟绿水前", "孤山寺北贾亭西", "断肠人在天涯", "故人具鸡黍", "一曲新词酒一杯", "何当共剪西窗烛", "误入藕花深处", "烟笼寒水月笼沙", "万籁此都寂", "初日照高林", "腾蛇乘雾"] # 将乔老师的答题卡文件夹路径 /Users/qiao/answerKey 赋值给变量allKeyPath allKeyPath = "/Users/qiao/answerKey" # 使用os.listdir()函数获取该路径下所有的文件,并赋值给变量allItems allItems = os.listdir(allKeyPath) # 定义一个空列表allStudentsData存储所有学生数据 allStudentsData = [] # 使用for循环逐个遍历所有学生答题卡 for item in allItems: # 定义一个空字典studentData存储单个学生数据 studentData = {}
# 使用os.path.splitext()函数获取文件名的前半段,并赋值给变量fileName fileName = os.path.splitext(item)[0] # 使用split()函数以"-"分隔文件名,将第1部分班级信息赋值到学生数据字典的classInfo键里 studentData["classInfo"] = fileName.split("-")[0] # 使用split()函数以"-"分隔文件名,将第2部分姓名信息赋值到学生数据字典的name键里 studentData["name"] = fileName.split("-")[1]
# 使用os.path.join()函数拼接出答题卡路径,并赋值给变量keyPath keyPath = os.path.join(allKeyPath, item) # 读取答题卡并赋值给变量doc doc = docx.Document(keyPath)
# 读取第四段学号段,并赋值给变量idPara idPara = doc.paragraphs[3] # 读取学号段中第二个样式块,并赋值给变量idRun idRun = idPara.runs[1] # 读取学号,并赋值到学生数据字典的id键里 studentData["id"] = idRun.text
# 使用range()函数生成遍历标准答案的索引列表 # 并赋值给变量indexList indexList = range(0, len(standardTwo))
# 使用for循环,遍历答题卡所在的段落索引 for i in indexList: # 通过indexList,记录对应的学生答案的段落索引 idx = i + 8 # 输出标准答案和对应的学生答案 print(standardTwo[i], doc.paragraphs[idx].runs[1].text) # 使用append()函数 # 将studentData添加到总学生数据allStudentsData中 allStudentsData.append(studentData) |
|
刚刚这样的方式,虽然能获取到标准答案和所对应的学生答案,但代码不够简单和优雅。
想一想是否有其它方法。