word文档的读入(5)

前面的课程中,我们已经掌握了读取学生答题卡中学号的方法。
接下来,我们将用类似的方法逐行读取填空题答案,并通过判断学生答案与标准答案是否一致来计算分数。

乔老师将填空题的标准答案存储在了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

要判断学生答案是否正确,需要在获取标准答案和学生答案后,将它们一一进行对比。接下来,我们会分别介绍两种方法~

第一种方式:
先使用range(0, len(…))来保存运行中standardTwo的每个元素的索引,也就是生成了一个从0开始到(len(standardTwo)-1)结束的列表indexList。
再用for循环遍历索引列表indexList。
在for循环里,通过把i和8相加,来记录学生答案所在的段落索引,并赋值给了idx。最后通过i和idx这两个索引,分别获取了标准答案和对应的学生答案。

# 使用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)

刚刚这样的方式,虽然能获取到标准答案和所对应的学生答案,但代码不够简单和优雅。

想一想是否有其它方法。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值