当前位置: 首页 > news >正文

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)

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

想一想是否有其它方法。


http://www.mrgr.cn/news/24429.html

相关文章:

  • 转行人员想做网络安全工程师有哪些要求?
  • 基于SpringBoot+Vue+MySQL的志愿服务管理系统
  • [SDOI2010] 地精部落(简单dp)
  • 多个时间序列的滞后相关性
  • JAVA学习-练习试用Java实现“最小覆盖子串”
  • 东土科技加码芯片业务投资,携手神经元共建新型工业生态
  • 编码与实现
  • 体育数据API纳米足球数据API:足球数据接口文档API示例⑩
  • 基于ts写法的一些 项目中会有所用到的功能函数
  • 区块链当前发展和未来展望
  • JavaScript高级——关于语句分号的问题
  • 如何在Windows系统上使用谷歌浏览器进行远程工作
  • Agent引领“ComfyUI全新升级” | 用户简单描述需求,“自动生成”完美工作流图,绝对吸睛!
  • Java——多态
  • MySQL内置函数
  • F-32产生了额外的行项目
  • 开放式耳机和骨传导耳机哪个对耳朵好?开放式耳机哪个牌子好?
  • ctfshow-web入门-sql注入(web244-web247)error 报错注入
  • 想报考pmp,一定得经过培训机构吗?
  • 从零到一,数字文创IP是如何在基地中孵化成长的?