前言
一键运行,1.4秒就搞定了600道单选题、301道判断题的答案录入工作:
再来看代码解析:
1、导入模块
import re
from docx import Document
import time
-
re:正则表达式的库,用于匹配括号。 -
docx:用于读取、处理、写入、保存word文档的库。 -
time:时间库,用于记录时间,计算时长。
2、文档读取
s_t = time.time()
xiti_doc = Document("调车长中级理论知识.docx")
daan_doc = Document("调车长中级理论知识答案.docx")
tk = {}
-
time.time():记录开始时间 -
xiti_doc = Document(“调车长中级理论知识.docx”):读取文档并赋值给xiti_doc。 -
tk = {} :创建空字典,用于存放处理后的用于填空的答案。
3、提取答案
for table in daan_doc.tables:
dic = {}
for row in table.rows:
for cell in row.cells:
if "." in cell.text:
key, value = cell.text.split(".")
dic[key] = value
tk["单选题" if len(dic) > 500 else "判断题"] = dic
-
for table in daan_doc.tables:遍历所有的表格,把当前表格赋值给table。 -
for row in table.rows:遍历所有的行。 -
for cell in row.cells:遍历所有的单元格。 -
if “.” in cell.text: 如果单元格文本包含点号(题号.答案格式),有效过滤了不符合答案形式的单元格。 -
key, value = cell.text.split(“.”):用“.”分隔遍历出的答案,key为题号,value为答案。 -
dic[key] = value:把key作为键,value作为值写入dic字典。 -
tk[“单选题” if len(dic) > 500 else “判断题”] = dic:根据答案数量判断题型,单选题>500为单选题,否则判断题,把dic作为值写入tk字典。
4、定义正则表达式的查找内容
regex = '|'.join([ # 使用|连接多个正则模式,表示"或"的关系
r'()', # 匹配中文括号
r'\(\)', # 匹配英文括号
r'\( \)', # 匹配中间有空格的英文括号
r'(\s*)', # 匹配中文括号中间可能有空格
r'\(\s*\)', # 匹配英文括号中间可能有空格
r'[\((]\s*[\))]' # 匹配混合括号(中英文混合)中间可能有空格])
-
使用“|”连接多个正则模式,表示”或”的关系 -
匹配中文或英文下的括号类型
5、填充答案
for page in xiti_doc.paragraphs:
if "单选题" in page.text:
tx = "单选题"
continue
elif "判断题" in page.text:
tx = "判断题"
continue
if "." in page.text:
key, value = page.text.split(".")
if t:=re.search(regex,page.text):
page.text = page.text.replace(t.group(),f"({tk[tx][str(key).strip()]})")
-
for page in xiti_doc.paragraphs:遍历题库文档的每个段落 -
if “单选题” in page.text:首先判断段落中是否包含”单选题”,如果包含,则让tx =”单选题”,使用continue 跳过后续处理,继续下一个段落,否则让让tx =”判断题”。 -
if “.” in page.text:判断段落中是否包含点号,如果是则说明是题目,并使用.split(“.”)对段落内容进行分隔,key为题号,value为内容。 -
if t:=re.search(regex, page.text):对遍历出的段落执行正则表达式的匹配,如果匹配成功,则进入下面的判断。 -
page.text.replace(t.group(),f”({tk[tx][str(key).strip()]})”):用replace替换匹配出的括号为带答案的括号。
6、保存结果与输出统计
xiti_doc.save("调车长中级理论知识+答案.docx")
e_t = time.time()
print(f"答案已填入\n单选题{len(tk["单选题"])}个\n判断题{len(tk["判断题"])}个\n用时{e_t-s_t:.2f}秒。")
-
保存处理的文档,并记录结束时间,显示处理结果。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容