刚刚我们获取到的是段落和样式块对象,要想读取到真正的文本内容,需要通过.text属性来访问。
不同的需求对应不同的操作。比如:
如果想读取某一段落中的所有文本,就使用.paragraphs[{段落索引}]获取到段落对象后,再访问它的.text属性;如果想读取某一个样式块中的文本内容,则是在使用doc.paragraphs[{段落索引}].runs[{样式块索引}]读取到具体的样式块对象后,访问.text属性。
逐步完善代码(根据注释,填写代码。) |
本例中,展示了读取学号的具体代码,也就是读取第四段的第二个样式块的文本内容。 |
# 使用import导入os模块 import os # 使用import导入docx import docx # 将乔老师的答题卡文件夹路径 /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)
# 使用print输出变量allStudentsData print(allStudentsData) |
总结:
现在,乔老师已经能很轻松地将学生的学号提取出来了。
明天的课程里,我们将用类似的方法逐行读取填空题答案,并通过判断学生答案与标准答案是否一致来计算分数。
选择题的答案读取因为涉及到表格的读取,将在第四天的课程中学习。