网络编程
位置:首页>> 网络编程>> Python编程>> Python使用docx模块实现刷题功能代码

Python使用docx模块实现刷题功能代码

作者:roohom  发布时间:2021-03-12 22:28:30 

标签:Python,docx模块,刷题

起由:

前一阵子想要刷一刷国二Python的题库,千方百计找到题库之后,打开一个个word文档,发现一题一题阅读很麻烦,而且答案就在题目的下面,阅读题目的时候想自己做出题目却又总能不经意看到答案,甚烦!遂开始敲代码,我要一题一题做,还不能看见答案。

着手:

word文档是这样的:

Python使用docx模块实现刷题功能代码

观察word内容,每道题目的题目内容和题目答案都是一样的格式,包括缩进、字体等等,那么就可以使用Python对文件的读操作,浏览文档的内容,在适当的内容区域设置输入,将输入与答案进行判断是否相等,即可实现简单的刷题功能。

Python默认不支持直接打开doc文件并读写,但是可以打开docx文件,但是docx文件必须是经过Word程序制作或转换而来的。如果文件太多,一个一个手动转化太麻烦,就要使用程序对文件批量转化,使用win32com模块可以使用此功能。

话不多说,放码!(部分思路在代码中注释):

首先批量将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

结果是这个样子的:

Python使用docx模块实现刷题功能代码

再进行我们的正题,开始刷题:


#!/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模块实现刷题功能代码

来源:https://blog.csdn.net/qq_39161804/article/details/82988319

0
投稿

猜你喜欢

  • 一、yield使用简析yield是一个生成器generator,返回一个interable对象。该对象具有next()方法,可以通过next
  • 如何显示数据库里的图片?asp调用数据库中的图片并显示。怎样把数据库里的图片显示出来?我们以gif格式的图片为例,代码如下:showimag
  • 初步确定是病毒破坏了文件的读写权限,现放出修复工具请中招朋友的测试!!使用方法:压缩包中文件全部解压或者直接运行压缩包中的iisfixer.
  • SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf
  • 介绍本文主要介绍Python中列表生成式的基本知识和使用生成列表要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  • 在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,总结如下:数据如下:>>>import
  • 程序流Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句。例如,清单 1 展示了几个
  • #这是Python中的一个字典 dic = { 'str': 'this is a string', 
  • 安装数据可视化模块matplotlib:pip install matplotlib导入matplotlib模块下的pyplot1 折线图f
  •  最近要做一个网站需要用到天气预报,本来是想找到API,自己写一个自己的天气预报小程序的,没有成功,只好去找现成的代码调用。经过测
  • 本文为大家分享了python字典DICT类型合并的方法,供大家参考,具体内容如下我要的字典的键值有些是数据库中表的字段名, 但是有些却不是,
  • BIT[(M)]位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。TINYINT[(M)] [UNSIGNED]
  • 最近碰到一个mysql5数据库的问题。就是一个标准的servlet/tomcat网络应用,后台使用mysql数据库。问题是待机一晚上后,第二
  • 利用Python生成PDF文件时,对比了fpdf和reportlab两个库。fpdf最新更新还是2015年,另外reportlab的资料网上
  • 是否看见大站的广告都是放在内容中间实现文字环绕的呢,一般普通小站广告只能放在内容开头或者结尾,也许大站的cms系统带这个功能吧,我们小站常用
  • 问题你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,A
  • 小渣渣复现大佬project发现GPU跑不动,出现如下报错:RuntimeError: CUDA out of memory.看下来最简单粗
  • 上篇博客转载了关于感知器的用法,遂这篇做个大概总结,并实现一个简单的感知器,也为了加深自己的理解。感知器是最简单的神经网络,只有一层。感知器
  • 触发器的概念:“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。”(Wikipedia)说得简单一些,它是在一个特殊的数据库事
  • 这是 小马 在交流会中的分享,可能有些朋友还不曾了解,同时也为了自己温故而知新,就整理下。多种方式可以想像得到,有很多方法立即执行匿名函数,
手机版 网络编程 asp之家 www.aspxhome.com