1. 程式人生 > 程式設計 >Python使用docx模組實現刷題功能程式碼

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模組實現刷題功能程式碼

以上這篇Python使用docx模組實現刷題功能程式碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。