Python利用docx模块实现计算机二级刷题工具
本文介绍如何使用Python的docx模块和win32com组件,批量将Word文档转换为docx格式,并编写脚本实现计算机二级Python题库的自动刷题功能。通过读取文档段落、判断答案位置并接收用户输入进行比对,解决了手动刷题时答案泄露的问题,提供了一套完整的本地刷题解决方案。
Python利用docx模块实现计算机二级刷题工具
起因:
近期计划进行全国计算机等级考试二级Python的题库练习。在获取题库文件后,发现直接打开Word文档逐题阅读体验不佳:题目与答案紧密相邻,容易在思考时意外看到答案,影响练习效果。因此决定编写程序,实现逐题作答且隐藏答案的功能。
准备工作:
文档格式分析与转换方案
原始Word文档的结构如下:

分析文档内容可知,所有题目的格式(包括缩进、字体等)高度一致。利用Python的文件读取功能,遍历文档内容,在特定位置插入输入交互,并将用户输入与预设答案进行比对,即可构建基础的刷题逻辑。
Python标准库不支持直接读写旧的.doc格式文件,但支持读写由Word软件生成或转换的.docx文件。若需处理大量旧格式文件,手动转换效率低下,因此需借助程序批量转换。此处使用win32com模块调用Word应用程序接口,实现doc到docx的批量转换。
具体实现代码如下(部分逻辑已在代码注释中说明):
批量转换doc为docx的实现
第一步,编写脚本将doc文件批量转换为Python可处理的docx文件:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File : 批量将doc转换为docx.py
# Author: roohom
# Date : 2018/9/17 0017
'''
使用Word批量将doc转化为docx
- 调用win32com,打开Word应用程序
- 打开doc
- 保存成docx
- 关闭word
- 转入下一个doc并重复上述操作
'''
from win32com import client as wc
def doSaveAas():
word = wc.Dispatch('Word.Application')
#延时5秒钟,防止由于系统配置原因还没打开Word就进行下一步程序
#time.sleep(5)
doc = word.Documents.Open(r'{0}'.format(word_name)) # 目标路径下的文件
doc.SaveAs(r'{0}'.format(word_docx_name), 16) # 转化后路径下的文件,16表示docx格式
doc.Close()
word.Quit()
if __name__ == '__main__':
k = 1
i = 3
j = 3
while True:
word_name = "D:\学习区\Python\python二级考试试题\选择题\python二级考试试题{0}.doc".format(i)
word_docx_name = "D:\学习区\Python\python二级考试试题\选择题\python二级考试试题{0}".format(j)
doSaveAas()
i += 1
j += 1
print("已完成{0}个word从doc到docx的转换".format(k))
k += 1
转换后的文件效果如下:

刷题脚本核心逻辑开发
接下来进行核心功能开发,即刷题逻辑的实现:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File : MyDemo.py
# Author: roohom
# Date : 2018/9/17 0017
'''
刷题脚本
- python对文件读写等操作的强大功能
- 使用docx模块对docx文档进行读写
- python不支持直接打开并读取word文档,因此需要使用方法将doc转化为docx,方法详见doc_to_docx.py
- 原理
- 打开经转化后的docx文档,并逐行读文件内容
- 判断是否读到“正确内容”语句
- 是,设置用户输入,提示输入用户的答案
- 否,继续读操作
- 比较用户的答案与正确答案是否一样
- 是,输出正确提示
- 否,输出错误提示
- 继续下一题,重复上述操作
- 拓展延伸
- 可以在程序主入口处设置用户输入,输入用户想要打开的路径、文件,程序根据文件名、路径等进行上述操作
- 可以根据用户输入情况设置加分减分,并根据全部答案情况,分析错误题目,后续将错题重修整理收集,反馈给用户
'''
import docx
'''
字符串比较的一种麻烦方法:
def comparison(a, b):
ib=0
for ia in range(len(a)):
if ord(a[ia:ia+1])-ord(b[ib:ib+1])==0:
ib=ib+1
if ib==len(b):
print('你的答案正确!')
else:
print('你的答案错误!')
break
'''
def comparison(a, b):
if a == b :
print("你的答案正确!")
else:
print("你的答案错误!")
if __name__ == '__main__':
file = docx.Document(r"D:\学习区\Python\python二级考试试题\选择题\python二级考试试题01.docx")
print("==================全国计算机二级考试之Python刷题==================")
for p in file.paragraphs:
m = p.text
if "正确答案: " in m:
ans = input("请输入你的答案:")
a = "正确答案: {0} ".format(ans)
print(a)
b = m
print(b)
comparison(a, b)
print()
print("==================全国计算机二级考试之Python刷题==================")
else:
print(m)
刷题运行效果如下:

上述内容即为利用Python docx模块实现刷题功能的完整代码分享,供读者参考与实践,欢迎支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









