一、概述

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自动生成试卷相关推荐

  1. python修改桌面壁纸_利用Python对windows桌面自动更换壁纸

    根据时间星期几判断用哪张壁纸 # !/usr/bin/env python3 # -*- coding:utf-8 -*- import requests # import pywintypes im ...

  2. python实现app自动签到器_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  3. python自动排课表_利用python爬取广西科技大学教务管理信息系统班级课表

    操作环境 python 3.6.1 pycharm 5.0.3 WampServer 3.0.6 windows 8(64位) 特点 1.中途退出程序或者断网之后重连再次运行不会抓取到重复的课程表 2 ...

  4. python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法

    利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...

  5. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  6. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  7. python自定义函数画图_利用Python绘图和可视化(长文慎入)

    Python有许多可视化工具,但是我主要讲解matplotlib(http://matplotlib.sourceforge.net).此外,还可以利用诸如d3.js(http://d3js.org/ ...

  8. python做股票分析_利用Python进行股票投资组合分析(调试)

    pythonsp500-robo-advisor-edition Python for Financial Analyses 需要的镜像文件和数据--Robo Advisor edition. 小结 ...

  9. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

最新文章

  1. 浅析网站建设的基本原则
  2. 科大星云诗社动态20210421
  3. 十二、Powerbi绘制人员地区分布图和后期学习
  4. Android DDMS如何使用?
  5. MYSQL高可用-Percona XtraDB Cluster
  6. Python_全局变量的定义
  7. Collectors.toMap()
  8. android统计测试题,Allocation Tracker(Android Studio)
  9. 服务器内存傲腾基本参数信息,服务器傲腾内存
  10. 51NOD 1432 独木舟
  11. 最新中国省市区SQL
  12. 金蝶osf接口开发_GitHub - terminiter/osf-openstack-training
  13. 快速傅里叶变换python_基于python的快速傅里叶变换FFT(二)
  14. 高速信号的完整性分析
  15. 我相信,一定有那么一句话可以温暖你的心
  16. Matlab/simulink、Saber及PSpice学习比较
  17. c语言桶是什么意思,桶排序算法
  18. 呦呦鹿鸣,食野之蒿。【诗经早就预言了屠呦呦的重大发现
  19. 普元王文斌:微服务架构开发模式需要全栈团队
  20. 使用html5制作聊天室,快速实现H5聊天室和管理功能

热门文章

  1. MySQL(九)插入、更新和删除
  2. MySQL(二)数据的检索和过滤
  3. 详细解读CSS链接属性——Web前端系列学习笔记
  4. 18行代码AC_Wet Shark and Bishops CodeForces - 621B(数学推导+映射)
  5. 华为鸿蒙不再孤单mmes,华为Watch GT2新色图赏 简约时尚设计新增100种运动模式
  6. java aio为什么不稳定_烯醇式结构为什么不稳定?
  7. Liunx操作系统的引导过程(系统操作引导过程,模拟MBR,GRUB故障,root密码遗忘解决,优化启动过程 ,运行级别的分类)
  8. 获取昨天凌晨毫秒数_Java 获取当前时间距离当天凌晨的秒数
  9. iphone电池怎么保养_蓄电池在ups系统中应该怎么维护保养?
  10. DataInputStream与DataOutputStream类