现在,乔老师已经了解了Word文档的基本结构。
下面,我们通过观察一份答题卡来思考一下每条信息的具体位置。这样,在后面几天的学习和操作中,我们就能更快、更准确地读取到答题卡中的信息。
这份答题卡是由一个表格和一些段落组成。
其中,学生的学号位于第4个段落中的第二个样式块。
接下来,我们需要读取答题卡中的表格来获取学生的选择题答案。
表格中的第二行是学生填写的内容,只需依次读取这一行中的信息,然后和标准答案进行对比,便可以算出选择题分数。
最后,通过依次读取剩下段落中的第二个样式块,我们便可以获取到学生的填空题内容。
填空题的第一题位于答题卡中的第9段,只需逐行读取到答题卡中的最后一个段落,然后和标准答案进行对比,便可以算出填空题的分数。
根据刚刚的定位,我们便可以得出获取学生学号、答题内容和对应分数的具体步骤:
1. 逐个读取班级文件夹下的学生答题卡
2. 获取学生的学号
3. 读取选择题答案并计算分数
4. 读取填空题答案并计算分数
在昨天的课程中,我们已经获取了学生的班级和姓名信息。现在,我们来根据昨天的定位,获取答题卡中学生的学号吧~具体步骤如下:
1. 安装和导入相关模块 2. 读取答题卡
3. 读取指定段落 4. 读取指定样式块
5. 获取文本内容
在终端中输入pip install python-docx安装模块。 |
要使用Python对Word文档进行读取,我们需要安装一个用于读取数据的工具python-docx。python-docx是一个用于创建和更新Word文档的开源模块。需要注意的是,该模块只可读取、写入.docx文件,不支持.doc文件。安装python-docx非常简单,在终端中输入代码:pip install python-docx即可。 |
代码:pip install python-docx |
完善代码(请使用import导入docx) |
安装完python-docx模块后,下一步就是导入这个模块。需要注意的是,导入python-docx模块需要使用import docx,而不是import python-docx。 |
# 使用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]
# 使用append()函数将studentData添加到总学生数据allStudentsData中 allStudentsData.append(studentData) |
在安装和导入python-docx之后,读取指定路径下的Word文档需要使用函数:docx.Document()。只需将Word文档的路径作为参数传入该函数中即可。docx.Document()函数读取成功后,会返回一个Word文档对象。
逐步完善代码(读取当前答题卡并赋值给变量doc。) |
乔老师要读取文件夹中的每一份答题卡,就需要在for循环里,先使用os.path.join()函数拼接出当前答题卡的路径。我们将拼接好的路径赋值给了keyPath。 |
# 使用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]
# TODO 使用os.path.join()函数拼接出答题卡路径,并赋值给变量keyPath keyPath = os.path.join(allKeyPath,item) # TODO 读取答题卡并赋值给变量doc doc = docx.Document(keyPath) # 使用print输出doc print(doc) # 使用append()函数将studentData添加到总学生数据allStudentsData中 allStudentsData.append(studentData) |
总结: