如何用python自动改试卷_利用Python和Jinja2自动生成试卷
一、概述
Jinja2是Python 3下一個被廣泛應用的模版引擎,它的設計思想來源于Django的模板引擎,并擴展了其語法和一系列強大的功能。其中最顯著的一個是增加了沙箱執行功能和可選的自動轉義功能,這對大多應用的安全性來說是非常重要的。
Jinja2常見的幾種模板語句如下:[1]
{%...%} #運行Jinja2的語句;
{{…}} #在頁面中打印Jinja2運行的結果
{#...#} #注釋
遍歷Python列表/元組生成HTML代碼的例子:
{% for user in users %}
{{ user.username }}{% endfor %}
在使用Python生成Word文檔的過程中,發現用模板技術可以節省大量的代碼。最近一個項目要導出Word文檔,于是將Word文檔導出為XML文件,再使用Jinja2的模板來生成XML文件,用Word軟件打開就得到了生成的Word文檔。這樣的做法比較方便省事,現在總結一下關鍵步驟,供大家參考,這里是一個簡單的試卷生成例子。
二、模板的制作
先用Word做一個試卷的模板文件,如圖1所示。
圖1Word試卷模板文件
然后將Word試卷模板文件另存為XML文件,之后用工具打開這個xml文件,這里用notepad++,主要是有高亮顯示,和元素自動配對,如圖2所示。
圖2 Word導出XML試卷模板文件
上面黑色的地方基本是我們之后要替換的地方,比如xx_title替換為{{ xx_title }},對已表格要十分注意,比如選擇題下面的表格,我們可以通過查找來定位,一對代表一行,也就是一條記錄(一道題),我們這里要用一對<% for … in … %><% endfor %>來將其包括,以便后續填充數據,具體可參照Jinja2頁面語法,例如這里選擇題,我們是兩行為一條記錄,所以要<% for … in … %><% endfor %>要包括兩行,形如:<% for q in questions %>題號 題目選項<% endfor %>,然后在這其中找著對應的q.xx,q.yyy,q.answer1,q.answer2,q.answer3,q.answer4替換為{{ q.xx }},{{ q.yyy }},{{ q.answer1 }},{{ q.answer2 }},{{ q.answer3 }},{{ q.answer4 }},注意這里的questions及q命名,questions后續填充數據要用到,其他的替換同理操作,如圖3所示。
圖3修改過的XML試卷模板文件
保存修改好的XML模板。
三、編程實現
使用Python開發腳本,調用jinja2包,讀取XML模板文件“template.xml”,在當前生成結果文件“試卷.xml”。首先,需要安裝Python的Jinjia2庫。可以在命令行提示符中用以下命令行在Windows系統中安裝Jinjia2庫,如圖5所示。
easy_install jinja
Python代碼如下:from jinja2 import Environment, FileSystemLoader
import os
# 獲取當前路徑
THIS_DIR = os.getcwd()
def generate_test_paper(title):
try:
# 創建 jinja2 環境
# Notice the use of trim_blocks, which greatly helps control
# whitespace.
paper_env = Environment(loader=FileSystemLoader(THIS_DIR),
trim_blocks=True)
#選擇題
questions = ({'xx':1,'yyy':"( )操作系統允許在一臺主機上同時連接多臺終端,多個用戶可以通過各自的終端同時交互地使用計算機。",'answer1':'Windows','answer2':'Linux','answer3':'Mac OS X','answer4':'DOS'},
{'xx':2,'yyy':"以下哪種類型是B/S構架的正確描述?",'answer1':'需要安裝客戶端的軟件','answer2':'不需要安裝就可以使用的軟件','answer3':'依托瀏覽器的網絡系統','answer4':'依托outlook等軟件的郵件系統'},
{'xx':3,'yyy':"下面哪個不是合法的SQL的歸類函數?",'answer1':'AVG','answer2':'SUM','answer3':'MIN','answer4':'CURRENT_DATE()'},
{'xx':4,'yyy':"PHP是一種什么型的語言:( )",'answer1':'編譯型','answer2':'解釋型','answer3':'兩者都是','answer4':'兩者都不是'})
#填空題
fillins = ({'xx':1,'yyy':"操作系統是計算機系統中的一個___系統軟件_______,它管理和控制計算機系統中的___資源_________。"},
{'xx':2,'yyy':"多道批處理系統的特點是_______和_______。"},
{'xx':3,'yyy':"處理機執行狀態有?______________?和______________兩種。"},
{'xx':4,'yyy':"實時系統應具有兩個基本特征:?_________和_________。"},)
#判斷題
judgments = ({'xx':1,'yyy':"軟件的開發與運行經常受到硬件的限制和制約。( )"},
{'xx':2,'yyy':"模塊內的高內聚往往意味著模塊間的松耦合。( )"},
{'xx':3,'yyy':"軟件的質量好壞主要由驗收人員負責,其他開發人員不必關心。( )"},
{'xx':4,'yyy':"判定覆蓋不一定包含條件覆蓋,條件覆蓋也不一定包含判定覆蓋。( )"},)
paper = paper_env.get_template('template.xml').render(xx_title=title,questions=questions,fillins=fillins,judgments=judgments, encoding='utf-8')
#簡答題
short_answers = ({'xx':1,'yyy':"SQL提供的基本數據類型有哪些?每種舉兩個例子。"},
{'xx':2,'yyy':"簡述Where子句與Having子句的區別。"},
{'xx':3,'yyy':"簡述視圖的定義以及與基本表的區別。"},
{'xx':4,'yyy':"簡述數據庫系統如何實現應用程序與數據物理獨立性和邏輯獨立性。"},)
# 從加載本地 template.xml 模板文件,并傳入數據
paper = paper_env.get_template('template.xml').render(xx_title=title,questions=questions,fillins=fillins,judgments=judgments,short_answers=short_answers, encoding='utf-8')
return paper
except Exception as e:
print("Generate test paper failed!")
raise e
def write_test_paper(title,paper_text):
try:
path = r'%s.xml' % title
with open(path, 'w', encoding='utf-8') as test:
test.write(paper_text)
return path
except Exception as e:
print("Write test paper failed!")
raise e
if __name__ == '__main__':
title = '試卷'
paper_text = generate_test_paper(title)
write_test_paper(title,paper_text)
print("Generate and write test paper successfully!")
注意上面元組questions、fillins、judgments和short_answers里的字典當中的key必須和模板中的對應,否則會報錯。
四、項目運行
下載附件后,解壓后,看到目錄中的文件,如圖4所示。
圖4壓縮包里的文件
打開命令行提示符,切換到解壓縮文件的目錄,執行命令行python jinja2_word.py,如圖6所示。
圖6運行Python腳本
Python腳本會在當前目錄下生成結果XML文件“試卷.xml”,如圖7所示。
圖7生成的結果XML文件
五、運行效果
用Microsoft Word打開生成的“試卷.xml”,如圖8所示。
圖8生成的結果XML文件
可將生成的結果XML文件另存為標準的Word文檔。
六、結語
本文通過使用Python腳本和Jinja2的模板技術實現了根據現有的Word模板文檔,通過程序導入結構化的數據自動生成試卷文檔。Jinja2的模板技術簡單易用性和Python的快速開發的特性結合在一起,使其相比其它的Word文檔生成技術難度更小、開發效率更高。
參考文獻
[1] Armin Ronacher. 模板設計者文檔. http://docs.jinkan.org/docs/jinja2/templates.html, 2013/6/30.
總結
以上是生活随笔為你收集整理的如何用python自动改试卷_利用Python和Jinja2自动生成试卷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java mvc返回js_Java的学习
- 下一篇: python采集_Python3做采集