word文档的读入(8)

如何读取答题卡中的选择题答案,并把所有的信息导入到Excel表格中~

在初始化了字典中的字段并获取了标准答案和学生答案后,现在只需使用if语句将学生答案studentAnswerOne和标准答案value进行比较。
选择题一道题2分,答案正确时,我们就给学生选择题分数加2分。具体代码如下:

# 使用import导入os模块

import os

# 使用import导入docx

import docx

# 第一大题选择题标准答案

standardOne = ['B', 'B', 'B', 'C', 'D', 'A', 'D', 'D', 'B', 'A']

# 第二大题填空题标准答案

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

   

    # 初始化学生数据字典里scoreTwo字段为0分,作为填空题分数

    studentData["scoreTwo"] = 0

    # 使用for循环和enumerate()函数

    # 遍历储存标准答案的列表standardTwo的同时

    # 生成一个从8开始的idx

    for idx,value in enumerate(standardTwo, 8):

        # 获取学生答案,并赋值给变量studentAnswerTwo

        studentAnswerTwo = doc.paragraphs[idx].runs[1].text

        # 判断当学生答案与标准答案相等时

        if studentAnswerTwo == value:

            # 当学生答案与标准答案一样时,学生的填空题分数加5分

            studentData["scoreTwo"] = studentData["scoreTwo"] + 5

    # 读取答题卡中的表格,并赋值给变量table

    table = doc.tables[0]

    # 读取表格中的第二行,并赋值给变量secRow

    secRow = table.rows[1]

    # 读取第二行中的所有单元格,并赋值给变量secCell

    secCell = secRow.cells

   

    # 初始化学生数据字典里scoreOne字段为0分,作为选择题分数

    studentData["scoreOne"] = 0

   

    # 使用for循环和enumerate()函数

    # 遍历储存标准答案的列表standardOne的同时

    # 生成一个从0开始的idx

    for idx,value in enumerate(standardOne):

        # 获取学生选择题答案,并赋值给变量studentAnswerOne

        studentAnswerOne = secCell[idx].text

        # 判断当学生答案与标准答案相等时

        if studentAnswerOne == value:

            # 当学生答案与标准答案一样时,学生的选择题分数加2分

            studentData["scoreOne"] = studentData["scoreOne"] + 2

   

    # 使用append()函数

    # 将studentData添加到总学生数据allStudentsData中

    allStudentsData.append(studentData)

   

# 使用print输出变量allStudentsData

print(allStudentsData)

现在,我们已经读取到了所有需要获取的信息,也计算出了学生的选择题和填空题的分数。
接下来,就可以利用之前所学的Excel表格相关知识,将信息依次导入到成绩表中啦~

如图:

创建工作簿和工作表

第一步:

第二步:

接下来,需要通过工作表对象["列号行号"] 的方式设置工作表中的表头,也就是将单元格A1、B1、C1、D1、E1的值都设置成如图所示:

依次将工作表中的表头设置成图中所示。

代码展示:

表头设置成功后,下一步就是将所有的学生数据写入到表格中。
这里,又可以通过for循环enumerate()函数,逐个遍历allStudentsData中的学生数据的同时,生成一个从2开始的索引值。

接下来,可以使用工作表对象["列号行号"] 的方式,依次将学生姓名班级学号选择题分数填空题分数依次填入到表格中。这里,我们通过了格式化的方式设置工作表对象["列号行号"],具体代码为:sheet[f"A{index}"]。
这样,随着遍历的进行,我们不需要一遍遍地去改变行数就能将信息逐行填入啦~

1

# 使用import导入os模块

2

import os

3

# 使用import导入docx

4

import docx

5

# 使用import导入openpyxl模块

6

import openpyxl

7

8

# 第一大题选择题标准答案

9

standardOne = ['B', 'B', 'B', 'C', 'D', 'A', 'D', 'D', 'B', 'A']

10

# 第二大题填空题标准答案

11

standardTwo = ["东临碣石", "行舟绿水前", "孤山寺北贾亭西", "断肠人在天涯", "故人具鸡黍", "一曲新词酒一杯", "何当共剪西窗烛", "误入藕花深处", "烟笼寒水月笼沙", "万籁此都寂", "初日照高林", "腾蛇乘雾"]

12

13

# 将乔老师的答题卡文件夹路径 /Users/qiao/answerKey 赋值给变量allKeyPath

14

allKeyPath = "/Users/qiao/answerKey"

15

# 使用os.listdir()函数获取该路径下所有的文件,并赋值给变量allItems

16

allItems = os.listdir(allKeyPath)

17

18

# 定义一个空列表allStudentsData存储所有学生数据

19

allStudentsData = []

20

21

# 使用for循环逐个遍历所有学生答题卡

22

for item in allItems:

23

    # 定义一个空字典studentData存储单个学生数据

24

    studentData = {}

25

    

26

    # 使用os.path.splitext()函数获取文件名的前半段,并赋值给变量fileName

27

    fileName = os.path.splitext(item)[0]

28

    # 使用split()函数以"-"分隔文件名,将第1部分班级信息赋值到学生数据字典的classInfo键里

29

    studentData["classInfo"] = fileName.split("-")[0]

30

    # 使用split()函数以"-"分隔文件名,将第2部分姓名信息赋值到学生数据字典的name键里

31

    studentData["name"] = fileName.split("-")[1]

32

    

33

    # 使用os.path.join()函数拼接出答题卡路径,并赋值给变量keyPath

34

    keyPath = os.path.join(allKeyPath, item)

35

    # 读取答题卡并赋值给变量doc

36

    doc = docx.Document(keyPath)

37

    

38

    # 读取第四段学号段,并赋值给变量idPara

39

    idPara = doc.paragraphs[3]

40

    # 读取学号段中第二个样式块,并赋值给变量idRun

41

    idRun = idPara.runs[1]

42

    # 读取学号,并赋值到学生数据字典的id键里

43

    studentData["id"] = idRun.text    

44

    

45

    # 初始化学生数据字典里scoreTwo字段为0分,作为填空题分数

46

    studentData["scoreTwo"] = 0

47

48

    # 使用for循环和enumerate()函数

49

    # 遍历储存标准答案的列表standardTwo的同时

50

    # 生成一个从8开始的idx

51

    for idx,value in enumerate(standardTwo, 8):

52

        # 获取学生答案,并赋值给变量studentAnswerTwo

53

        studentAnswerTwo = doc.paragraphs[idx].runs[1].text

54

        # 判断当学生答案与标准答案相等时

55

        if studentAnswerTwo == value:

56

            # 当学生答案与标准答案一样时,学生的填空题分数加5

57

            studentData["scoreTwo"] = studentData["scoreTwo"] + 5

58

59

    # 读取答题卡中的表格,并赋值给变量table

60

    table = doc.tables[0]

61

    # 读取表格中的第二行,并赋值给变量secRow

62

    secRow = table.rows[1]

63

    # 读取第二行中的所有单元格,并赋值给变量secCell

64

    secCell = secRow.cells

65

    

66

    # 初始化学生数据字典里scoreOne字段为0分,作为选择题分数

67

    studentData["scoreOne"] = 0

68

    

69

    # 使用for循环和enumerate()函数

70

    # 遍历储存标准答案的列表standardOne的同时

71

    # 生成一个从0开始的idx

72

    for idx,value in enumerate(standardOne):

73

        # 获取学生选择题答案,并赋值给变量studentAnswerOne

74

        studentAnswerOne = secCell[idx].text

75

        # 判断当学生答案与标准答案相等时

76

        if studentAnswerOne == value:

77

            # 当学生答案与标准答案一样时,学生的选择题分数加5

78

            studentData["scoreOne"] = studentData["scoreOne"] + 5

79

    

80

    # 使用append()函数将studentData添加到总学生数据allStudentsData

81

    allStudentsData.append(studentData)

82

83

# 创建一个新工作簿,并赋值给变量newWb

84

newWb = openpyxl.Workbook()

85

# 将名为Sheet的默认工作表赋值给变量sheet

86

sheet = newWb["Sheet"]

87

# sheet工作表名称修改为"成绩表"

88

sheet.title = "成绩表"

89

90

# 给工作表设置表头

91

sheet["A1"].value = "学生姓名"

92

sheet["B1"].value = "学生班级"

93

sheet["C1"].value = "学生学号"

94

sheet["D1"].value = "选择题分数"

sheet["E1"].value = "填空题分数"

# 使用for循环和enumerate()函数

# 遍历所有学生数据allStudentsData的同时

# 生成一个从2开始的index

for index, studentData in enumerate(allStudentsData,2):

    # 设置学生姓名

    sheet[f"A{index}"].value = studentData["name"]

    # 设置学生班级

    sheet[f"B{index}"].value = studentData["classInfo"]

    # 设置学生学号

    sheet[f"C{index}"].value = studentData["id"]

    # 设置选择题分数

    sheet[f"D{index}"].value = studentData["scoreOne"]

    # 设置填空题分数

    sheet[f"E{index}"].value = studentData["scoreTwo"]

到目前为止,我们已经将数据全部导入到了Excel表格中。为了持久化存储工作簿,我们需要通过save()函数把工作簿以文件的形式存储到指定路径

Excel 与 Word 中的表格

在编写代码的过程中,需要同时操作Excel与Word中的表格,容易混淆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537591.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

pgsql的威胁操作--危险行为

pgsql的威胁操作--危险行为 要在PostgreSQL中列出所有数据库并删除指定的数据库 进入容器Pgsql docker exec -it 04d438beab57 /bin/bash 登录pgsql 使用以下命令登录到PostgreSQL psql -U postgres -h localhost -p 5432 列出数据库详细信息 postgres# \l 这将显示所有…

C语言代码练习(第二十六天)

今日练习: 数据的交换输出输入 n 个数,找出其中最小的数,将它与最前面的数交换后输出这些数 输入一个英文句子,将每个单词的第一个字母改成大写字母 输入一个十进制数 N ,将它转换成 R 进制数输出 数据的交换输出输入 …

34.贪心算法1

0.贪心算法 1.柠檬水找零(easy) . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元:直接收下…

【Git】将本地项目上传到git | 在IDEA的提交记录中更改 提交的用户名

一:将本地项目上传到git 1:在​gitee​上创建以自己项目名称命名的空项目【注意项目名称与本地项目的文件夹名称一致】 2:进入想上传的项目的文件夹,然后右键点击 3:查看用户名及邮箱 $ git config user.name $ git config user.email4: 配置你的用户名及邮箱【如果有…

李宏毅2023机器学习HW15-Few-shot Classification

文章目录 LinkTask: Few-shot ClassificationBaselineSimple—transfer learningMedium — FO-MAMLStrong — MAML Link Kaggle Task: Few-shot Classification The Omniglot dataset background set: 30 alphabetsevaluation set: 20 alphabetsProblem setup: 5-way 1-sho…

【代码随想录训练营第42期 Day59打卡 - 图论Part9 - Bellman-Ford算法

目录 一、Bellman-Ford算法 定义 特性 伪代码实现 二、经典题目 题目:卡码网 94. 城市间货物运输 I 题目链接 题解: Bellman-Ford算法 三、小结 一、Bellman-Ford算法 定义 Bellman-Ford算法是一个迭代算法,它可以处理包含负权边的…

Zabbix的安装与基本使用(主机群组、应用集、监控项、触发器、动作、媒介)

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、环境准备 (1)实验基本设置: 主机名IP地址角色Mater192.168.1.10监控端node1192.168.1.11被监控端 # 网络自…

『功能项目』制作提示主角升级面板【56】

我们打开上一篇55事件中心处理怪物死亡的项目, 本章做的事情是制作提示主角升级的界面,当主角升级时就会被显示出来点击确认即可消失 首先在unity编辑场景制作 在确认按钮对象上添加事件 点击Button将Panel添加至事件框选 在事件函数中选择gameobject.S…

Linux操作系统入门(五)

————————————————————————————————————————— 至此,大部分Linux操作系统的文件操作指令已经总结完成,最后还需进行vim编辑器的使用 使用方法:在FinalShell终端中输入"vim [文件]",以下图…

微信支付开发-前端api实现

一、操作流程图 二、代码实现 <?php /*** 数字人答题业务流* User: 龙哥三年风水* Date: 2024/9/11* Time: 14:59*/ namespace app\controller\shuziren; use app\controller\Base; use app\model\param\QuestionParam as PQPModel; use app\model\answer\QuestionBank; u…

这个公司可以做点什么呢?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

C++ Primer Plus(速记版)-容器和算法

第九章 顺序容器 容器是存储特定类型对象的集合&#xff0c;标准库提供了多种容器类型以支持不同的使用场景。其中&#xff0c;顺序容器&#xff08;如vector、list、deque&#xff09;根据元素添加到容器中的顺序来存储和访问元素&#xff0c;与元素值无关。 这些顺序容器各有…

Vue Application exit (SharedArrayBuffer is not defined)

vite配置 export default defineConfig { server: {cors: true, // 启用 CORSheaders: {Cross-Origin-Opener-Policy: same-origin,Cross-Origin-Embedder-Policy: require-corp,cross-origin-resource-policy: cross-origin}}, } 错误处理 报其它错误&#xff0c;如(Compi…

第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等

案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口&#xff08;默认为21&#xff09; ftp_po…

chromedriver下载与安装方法

chromedriver下载地址&#xff1a; 版本在114及以下&#xff1a;http://chromedriver.storage.googleapis.com/index.html 版本在128&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/#stable 其他版本下载方法&#xff1a; 如版本128.0.6613.137位下载地址…

婴儿接触危险物品检测系统源码分享

婴儿接触危险物品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

计算机三级网络技术总结(三)

宽带&#xff08;bandwidth&#xff09;单位是kbpspos framing sdh / pos framing sonetpos flag s1s0 2 / pos flag s1s0 0CRC 32network <目的网络的ip地址><子网掩码的反码>area 0area 0 range<子网地址><子网掩码>ip route <目的网络地址>&l…

通信工程学习:什么是GPON吉比特无源光网络

GPON&#xff1a;吉比特无源光网络 GPON&#xff08;Gigabit-Capable Passive Optical Network&#xff0c;吉比特无源光网络&#xff09;是一种基于ITU-T G.984.x标准的最新一代宽带无源光综合接入技术。该技术以其高带宽、高效率、大覆盖范围和用户接口丰富等特点&#xff0c…

并发安全与锁

总述 这篇文章&#xff0c;我想谈一谈自己对于并发变成的理解与学习。主要涉及以下三个部分&#xff1a;goroutine&#xff0c;channel以及lock 临界区 首先&#xff0c;要明确下面两组概念 并发和并行 并行&#xff1a;指几个程序每时每刻都同时进行 并发&#xff1a;指…

JVM 一个对象是否已经死亡?

目录 前言 引用计数法 可达性分析法 引用 finalize() 方法区回收 前言 虚拟机中垃圾回收器是掌握对象生死的判官, 只要是垃圾回收器认为需要被回收的, 那么这个对象基本可以宣告"死亡". 但是也不是所有的对象, 都需要被回收, 因此, 我们在学习垃圾回收的时候…