You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
4.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用import导入os模块
import os , docx , openpyxl
# 第一大题选择题标准答案
standardOne = ['B', 'B', 'B', 'C', 'D', 'A', 'D', 'D', 'B', 'A']
# 第二大题填空题标准答案
standardTwo = ["东临碣石", "行舟绿水前", "孤山寺北贾亭西", "断肠人在天涯", "故人具鸡黍", "一曲新词酒一杯", "何当共剪西窗烛", "误入藕花深处", "烟笼寒水月笼沙", "万籁此都寂", "初日照高林", "腾蛇乘雾"]
# 将答题卡文件夹路径赋值给变量allKeyPath
allKeyPath = input("请输入答题卡文件夹路径:")
# 使用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:
# 当学生答案与标准答案一样时学生的选择题分数加5分
studentData["scoreOne"] = studentData["scoreOne"] + 5
# 使用append()函数将studentData添加到总学生数据allStudentsData中
allStudentsData.append(studentData)
# 创建一个新工作簿并赋值给变量newWb
newWb = openpyxl.Workbook()
# 将名为Sheet的默认工作表赋值给变量sheet
sheet = newWb["Sheet"]
# 将sheet工作表名称修改为"成绩表"
sheet.title = "成绩表"
# 给工作表设置表头
sheet["A1"].value = "学生姓名"
sheet["B1"].value = "学生班级"
sheet["C1"].value = "学生学号"
sheet["D1"].value = "选择题分数"
sheet["E1"].value = "填空题分数"
# 使用for循环和enumerate()函数
# 遍历所有学生数据allStudentsData的同时
# 生成一个从2开始的index
for index, studentData in enumerate(allStudentsData,2):
# 将第A列数据设置为学生姓名studentData["name"]
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"]
# 使用save()函数将工作簿保存到 /Users/qiao/answerKey/成绩汇总.xlsx 路径下
newWb.save(f"{allKeyPath}/成绩汇总.xlsx")