word文档的读入(8)

news2024/12/26 11:51:45

如何读取答题卡中的选择题答案,并把所有的信息导入到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.coloradmin.cn/o/2143702.html

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

相关文章

C++11 右值引用完美转发

前言 上一期介绍了C11的基础新特性,这一期开始我们继续来介绍C11的新特性! 目录 前言 一、右值引用和移动语义 1.1左值和左值引用 1.2右值和右值引用 1.3左值引用vs右值引用 1.4右值引用的使用场景和意义 左值引用的使用场景 左值引用的缺陷 …

应用案例|开源 PolarDB-X 在互联网安全场景的应用实践

背景介绍 中盾数科集团始创于2012年,是由网络安全服务而发展起来的科技型、多元化的企业集团。旗下包括网络安全服务、信创一体化服务、箱式液冷、区块链、位置服务、视觉服务等六大板块,业务覆盖湖南、甘肃、贵州等多个省份。 业务挑战 中盾集团基于A…

LabVIEW提高开发效率技巧----模块化设计与代码复用

模块化设计是现代软件开发中不可或缺的理念,在LabVIEW开发中尤为重要。通过将系统功能划分为独立的、可复用的模块,开发者可以显著提升代码的可读性、维护性以及效率。下面将介绍模块化设计的核心概念、如何利用子VI实现代码复用、以及使用模板&#xff…

claude,gpt,通义千问

起因是通义千问对这张图的解释有严重错误,因此想着让claude和gpt回答一下,记录一下。 claude 这张图表显示了中国多个城市的房地产价格指数数据。让我为您解读一下主要信息: 指标解释: "环比": 与上月相比的价格变化&…

[yotroy.cool] MGT 388 - Finance for Engineers - notes 笔记

个人博客https://www.yotroy.cool/,感谢关注~ 图片资源可能显示不全,请前往博客查看哦! ============================================================ Lecture 1 What is Accounting? The process of identifying, measuring and communicating economic informati…

【UEFI基础】BIOS下的启动项管理

启动管理 启动管理(Boot Manager)是UEFI BIOS中重要的一部分,它通过一系列的变量来确定启动策略,包括: 执行启动还是恢复操作启动顺序是如何 本文会介绍下面的内容: 与启动管理相关的变量启动或恢复的流…

Git rebase 的使用(结合图与案例)

目录 Git rebase 的使用Git rebase 概念Git rebase 原理rebase和merge的选择 Git rebase 的使用 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase Git rebase 概念 **rebase概念:**用来重新应用提交(commits&#xff09…

Vue2知识点

注意:笔记内容来自网络 1Vue指令 指令是指&#xff1a;带有v-前缀的特殊标签属性 1.1 v-html v-html&#xff08;类似 innerHTML&#xff09; 使用语法&#xff1a;<p v-html"intro">hello</p>&#xff0c;意思是将 intro 值渲染到 p 标签中 类似 i…

神经网络-MNIST数据集训练

文章目录 一、MNIST数据集1.数据集概述2.数据集组成3.文件结构4.数据特点 二、代码实现1.数据加载与预处理2. 模型定义3. 训练和测试函数4.训练和测试结果 三、总结 一、MNIST数据集 MNIST数据集是深度学习和计算机视觉领域非常经典且基础的数据集&#xff0c;它包含了大量的手…

链表的合并,结点逆置,顺序表的高效划分(数据结构作业02)

目录 链表的合并 链表的结点逆置 顺序表的高效划分 链表的合并 已知两个递增有序的单链表A和B&#xff0c;分别表示两个集合。试设计一个算法&#xff0c;用于求出A与B的交集&#xff0c;并存储在C链表中。例如 : La {2&#xff0c;4&#xff0c;6&#xff0c;8}&#xff1b;…

闯关leetcode——28. Find the Index of the First Occurrence in a String

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 内容 Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if …

冒泡排序的C++语言实现(不用std::sort)

自己写一个冒泡排序的代码。 void vSort(std::vector<int> & vec, bool bDescending) {//冒泡排序int iTail vec.size()-1;while(iTail > 0){for(int k 0; k < iTail; k){int f1 vec.at(k);int f2 vec.at(k1);if(f1 < f2){//默认是降序int iTmp vec.a…

为什么大公司不用pandas取代excel?

如果你熟练使用Excel的话&#xff0c;你就会发现有些pandas的功能&#xff0c;在Excel中也可以实现&#xff0c;而且对比下来&#xff0c;Excel操作更简单&#xff0c;从效率上跟pandas更无二致&#xff0c;这样Excel的优势就比较突出了&#xff0c;比如下面使用pandas和Excel分…

【实战篇】幻读是什么,幻读有什么问题?

背景 我们先使用一个小一点儿的表。建表和初始化语句如下&#xff1a; CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB; insert into t values(0,0,0),(5,5,5), (10,10,10),(15,15,15),(20,…

2010-2022 CSP-J/普及组T1-T4考点统计

T1考点统计 T2考点统计 T3考点统计 T4考点统计 总结

MOE论文汇总2

TASK-CUSTOMIZED MASKED AUTOENCODER VIA MIXTURE OF CLUSTER-CONDITIONAL Experts 这篇论文提出了一种新颖的自监督学习方法&#xff0c;名为“Mixture of Cluster-conditional Experts (MoCE)”&#xff0c;旨在解决传统Masked Autoencoder (MAE)在不同下游任务中可能遇到的负…

蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)

一、C语言常识 printf和sprintf的主要区别在于它们的功能和用途&#xff1a; printf&#xff1a;主要用于将格式化的数据输出到标准输出&#xff08;如屏幕&#xff09;。sprintf&#xff1a;则是将格式化的数据存储到一个指定的字符串缓冲区中&#xff0c;而不是直接输出。 pr…

Docker实操:安装MySQL5.7详解(保姆级教程)

介绍 Docker 中文网址: https://www.dockerdocs.cn Docker Hub官方网址&#xff1a;https://hub.docker.com Docker Hub中MySQL介绍&#xff1a;https://hub.docker.com/_/mysql ​ 切换到“Tags”页面&#xff0c;复制指定的MySQL版本拉取命令&#xff0c;例如 &#xff1a…

LabVIEW提高开发效率技巧----使用LabVIEW工具

LabVIEW为开发者提供了多种工具和功能&#xff0c;不仅提高工作效率&#xff0c;还能确保项目的质量和可维护性。以下详细介绍几种关键工具&#xff0c;并结合实际案例说明它们的应用。 1. VI Analyzer&#xff1a;自动检查代码质量 VI Analyzer 是LabVIEW提供的一款强大的工…

架构师,被严重低估的角色!

在企业数字化转型与变革的壮阔浪潮中&#xff0c;企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;作为一门高度复杂且跨学科的知识体系&#xff0c;无可争议地成为了驱动组织战略深化与技术创新的核心引擎。尽管市场上充斥着丰富的指导理论与参考资料&…