如何建立自己的題庫,實現往題庫中輸入問題、答案,且讓題庫隨機出題
阿新 • • 發佈:2022-04-10
原理:
本人把題庫用xml檔案的方式儲存,實際上就是xml的讀取和寫入的實現
示例題庫:
<?xml version="1.0" encoding="utf-8"?> <root> <chapter id="1" name="網球"> <segment id="1"> <question>網球拍</question> <answer>tennis racket</answer> </segment> <segment id="2"> <question>共享單車</question> <answer>shared bike</answer> </segment> </chapter> <chapter id="2" name="歷史文化"> <segment id="1"> <question>講究/強調</question> <answer>attach great significance to</answer> </segment> <segment id="2"> <question>以……為基礎</question> <answer>be set in</answer> </segment> </chapter> </root>
首先導庫:
from xml.dom.minidom import parse
import numpy
由於可能存在多個題庫,比如數學、英語題庫,故讓使用者輸入題庫名選擇題庫(即xml檔案):
print('choose xml file:')
xmlName = input('type in:')
解析xml檔案並獲取根元素:
DomTree = parse(f'{xmlName}.xml')
root = DomTree.documentElement
接下來讓使用者選擇做題還是往題庫中寫題:
print('for examination, type in 0\nfor creation, type in 1') judge = input('type in:')
一個題庫中可能有多個章節,接下來展示章節名,讓使用者選擇章節(本人把章節名放在<chapter>標籤的name屬性中,見文章開頭):
print('chapter:')
chapterList = root.getElementsByTagName('chapter')
for i in range(chapterList.length):
print(chapterList[i].getAttribute('id') + '、' + chapterList[i].getAttribute('name'))
chapterNumStr = input('choose chapter:')
chapterNum = int(chapterNumStr)
獲取對應章節的問題和答案(均放在<segment>標籤下):
chapter = root.getElementsByTagName('chapter')[chapterNum - 1]
segment = chapter.getElementsByTagName('segment')
如若使用者選擇做題,詢問使用者按照順序做題還是打亂順序(numpy.random.permutation()方法)做題,並展示題目,使用者輸入答案後按下回車會展示參考答案並展示下一個題目,本人沒有判斷使用者輸入的答案是否正確,各位可以試著新增:
if judge == '0':
print('out of order, type in 0\nin order, type in 1')
ifRandom = input('type in:')
if ifRandom == '0':
for i in numpy.random.permutation(range(segment.length)):
print('question:\n' + segment[i].getElementsByTagName('question')[0].childNodes[0].data)
print("answer:")
pause = input('yours:')
print("reference:" + segment[i].getElementsByTagName('answer')[0].childNodes[0].data + '\n')
elif ifRandom == '1':
for i in range(segment.length):
print('question:\n' + segment[i].getElementsByTagName('question')[0].childNodes[0].data)
print("answer:")
pause = input('yours:')
print("reference:" + segment[i].getElementsByTagName('answer')[0].childNodes[0].data + '\n')
如若使用者選擇往題庫中寫題,我們定義一個函式,讓使用者依次輸入問題、答案,並迴圈往復,使用者可以在輸入問題時輸入"break"來跳出迴圈,最後把問題節點(<question>)和答案節點(<answer>)懸掛到新生成的<segment>節點下,寫入xml就可以了:
segLength = segment.length
elif judge == '1':
print('type in "break" in question to jump out of the loop')
def write_question():
global segLength
segLength += 1
q = input('type in question:')
if q == 'break':
print('*******************')
print('Program terminated.')
print('*******************')
else:
a = input('type in answer:')
creationS = DomTree.createElement('segment')
creationS.setAttribute('id', str(segLength))
creationQ = DomTree.createElement('question')
textQ = DomTree.createTextNode(q)
creationQ.appendChild(textQ)
creationA = DomTree.createElement('answer')
textA = DomTree.createTextNode(a)
creationA.appendChild(textA)
creationS.appendChild(creationQ)
creationS.appendChild(creationA)
chapter.appendChild(creationS)
with open(f'{xmlName}.xml', 'w', encoding='utf-8') as f:
DomTree.writexml(f, addindent='', encoding='utf-8')
write_question()
write_question()