如何用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自动生成试卷相关推荐
- python修改桌面壁纸_利用Python对windows桌面自动更换壁纸
根据时间星期几判断用哪张壁纸 # !/usr/bin/env python3 # -*- coding:utf-8 -*- import requests # import pywintypes im ...
- python实现app自动签到器_利用Python实现App自动签到领取积分
要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...
- python自动排课表_利用python爬取广西科技大学教务管理信息系统班级课表
操作环境 python 3.6.1 pycharm 5.0.3 WampServer 3.0.6 windows 8(64位) 特点 1.中途退出程序或者断网之后重连再次运行不会抓取到重复的课程表 2 ...
- python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法
利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...
- python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)
抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...
- python post请求 上传图片_利用python模拟实现POST请求提交图片的方法
本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...
- python自定义函数画图_利用Python绘图和可视化(长文慎入)
Python有许多可视化工具,但是我主要讲解matplotlib(http://matplotlib.sourceforge.net).此外,还可以利用诸如d3.js(http://d3js.org/ ...
- python做股票分析_利用Python进行股票投资组合分析(调试)
pythonsp500-robo-advisor-edition Python for Financial Analyses 需要的镜像文件和数据--Robo Advisor edition. 小结 ...
- python实现邮件客户端_利用python实现简单的邮件发送客户端示例
脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...
最新文章
- 浅析网站建设的基本原则
- 科大星云诗社动态20210421
- 十二、Powerbi绘制人员地区分布图和后期学习
- Android DDMS如何使用?
- MYSQL高可用-Percona XtraDB Cluster
- Python_全局变量的定义
- Collectors.toMap()
- android统计测试题,Allocation Tracker(Android Studio)
- 服务器内存傲腾基本参数信息,服务器傲腾内存
- 51NOD 1432 独木舟
- 最新中国省市区SQL
- 金蝶osf接口开发_GitHub - terminiter/osf-openstack-training
- 快速傅里叶变换python_基于python的快速傅里叶变换FFT(二)
- 高速信号的完整性分析
- 我相信,一定有那么一句话可以温暖你的心
- Matlab/simulink、Saber及PSpice学习比较
- c语言桶是什么意思,桶排序算法
- 呦呦鹿鸣,食野之蒿。【诗经早就预言了屠呦呦的重大发现
- 普元王文斌:微服务架构开发模式需要全栈团队
- 使用html5制作聊天室,快速实现H5聊天室和管理功能
热门文章
- MySQL(九)插入、更新和删除
- MySQL(二)数据的检索和过滤
- 详细解读CSS链接属性——Web前端系列学习笔记
- 18行代码AC_Wet Shark and Bishops CodeForces - 621B(数学推导+映射)
- 华为鸿蒙不再孤单mmes,华为Watch GT2新色图赏 简约时尚设计新增100种运动模式
- java aio为什么不稳定_烯醇式结构为什么不稳定?
- Liunx操作系统的引导过程(系统操作引导过程,模拟MBR,GRUB故障,root密码遗忘解决,优化启动过程 ,运行级别的分类)
- 获取昨天凌晨毫秒数_Java 获取当前时间距离当天凌晨的秒数
- iphone电池怎么保养_蓄电池在ups系统中应该怎么维护保养?
- DataInputStream与DataOutputStream类