如何读取答题卡中的选择题答案,并把所有的信息导入到Excel表格中~
在初始化了字典中的字段并获取了标准答案和学生答案后,现在只需使用if语句将学生答案studentAnswerOne和标准答案value进行比较。 |
# 使用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的值都设置成如图所示:
依次将工作表中的表头设置成图中所示。
代码展示:
表头设置成功后,下一步就是将所有的学生数据写入到表格中。 |
接下来,可以使用工作表对象["列号行号"] 的方式,依次将学生姓名、班级、学号、选择题分数和填空题分数依次填入到表格中。这里,我们通过了格式化的方式设置工作表对象["列号行号"],具体代码为: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中的表格,容易混淆。