Python+MySQL随机试卷及答案生成程序的示例代码


Posted in Python onFebruary 01, 2021

一、背景

本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样。

二、准备工作

1.安装Python3

下载地址:https://www.python.org/downloads/windows/

2.安装库

pip installpython-docx==0.8.10

pip installPyMySQL==1.0.2

3.试题库.xlsx

开发程序前需要先收集试题,本文是将试题收集存放MySQL数据库中,格式如下:

选择题数据库截图:

Python+MySQL随机试卷及答案生成程序的示例代码

填空题/解答题/综合题数据库截图:

Python+MySQL随机试卷及答案生成程序的示例代码

三、代码

Python+MySQL随机试卷及答案生成程序.py

# _*_ coding:utf-8 _*_
import random,os,pymysql
from docx import Document
from docx.shared import Inches,Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING
from docx.oxml.ns import qn
from docx.shared import Inches

class SunckSql():
 def __init__(self, host, user, passwd, dbName='', charset='utf8'):
  self.host = host
  self.user = user
  self.passwd = passwd
  self.dbName = dbName
  self.charset = charset

 def connet(self):
  self.db = pymysql.connect(host=self.host, user=self.user, passwd=self.passwd, db=self.dbName,
         charset=self.charset) # 连接数据库
  self.cursor = self.db.cursor() # 获取操作游标

 def close(self):
  self.cursor.close() # 释放游标
  self.db.close() # 关闭数据库连接

 # 查询
 def get_all(self, sql):
  res = None
  try:
   self.connet()
   self.cursor.execute(sql) # 执行sql语句
   res = self.cursor.fetchall() # 返回查询所有结果
  except Exception as e:
   print('查询失败:%s' % e)
  finally:
   self.close()
  return res

 # 增加、删除、修改
 def shell_sql(self, sql):
  "执行sql语句"
  print(sql)
  count = 0
  try:
   self.connet()
   count = self.cursor.execute(sql) # 执行sql语句
   self.db.commit() # 提交
  except Exception as e:
   print('事务提交失败:%s' % e)
   self.db.rollback() # 如果提交失败,回滚到上一次数据
  finally:
   self.close()
  return count

def router_docx(choice1='', choice2='', choice3='', choice5='', choice6='', choice7='',paper_path='',name='1'):
 "生成网络通信方向试题及答案"
 docx1 = Document()
 docx2 = Document()
 docx1.styles['Normal'].font.name = '宋体'         #选择字体
 docx1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') #默认字体
 docx1.styles['Normal'].font.size = Pt(11)        #默认字号大小
 docx1.styles['Normal'].paragraph_format.space_before = Pt(0)    #默认段前间距
 docx1.styles['Normal'].paragraph_format.space_after = Pt(0)    #默认段后间距
 docx1.styles['Normal'].paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #默认单倍行距
 sec = docx1.sections[0]             # sections对应文档中的“节”
 sec.left_margin = Inches(1)            # 设置左页面边距
 sec.right_margin = Inches(1)            #设置右页面边距
 sec.top_margin = Inches(0.5)            # 设置上页面边距
 sec.bottom_margin = Inches(0.5)           #设置下页面边距

 p=docx1.add_paragraph()             #添加段落
 run = p.add_run('软件测试(网络通信)方向试题(%s)' % name)      #使用add_run添加文字
 run.font.name = '微软雅黑'             #设置字体
 run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')     #设置字体
 run.font.size = Pt(18)             #字体大小设置
 p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER     #段落文字居中设置
 docx1.add_paragraph('【说明】')           # 添加段落文字
 docx1.add_paragraph('1.笔试时间为60分钟。')
 docx1.add_paragraph('2.请将答案写在答题卡上,且不允许在试题卷上做任何涂写和标记。')
 q=docx2.add_paragraph()             #添加段落
 run = q.add_run('软件测试(网络通信)方向试题答案(%s)' % name)     #使用add_run添加文字
 run.font.name = '微软雅黑'             #设置字体
 run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')     #设置字体
 run.font.size = Pt(18)             #字体大小设置
 q.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER     #段落文字居中设置

 p1 = docx1.add_paragraph()
 p1.paragraph_format.space_before = Pt(12)        #设置段前间距
 docx2.add_paragraph('一、选择题')
 run = p1.add_run('一、选择题(每题3分共45分)')
 run.bold = True               # 字体加粗
 list1=random.sample(range(0,len(choice1)-1),3)       #len范围内获取指定的数量
 x=1
 for y in list1:
  docx1.add_paragraph(str(x)+'、'+choice1[y][1])
  docx1.add_paragraph(choice1[y][2])
  docx1.add_paragraph(choice1[y][3])
  docx1.add_paragraph(choice1[y][4])
  p11=docx1.add_paragraph(choice1[y][5])
  p11.paragraph_format.space_after = Pt(12)       #段后间距
  docx2.add_paragraph(str(x)+'、'+choice1[y][6])
  x+=1

 list2=random.sample(range(0,len(choice2)-1),7)
 x=1
 for y in list2:
  docx1.add_paragraph(str(x+3)+'、'+choice2[y][1])
  docx1.add_paragraph(choice2[y][2])
  docx1.add_paragraph(choice2[y][3])
  docx1.add_paragraph(choice2[y][4])
  p11=docx1.add_paragraph(choice2[y][5])
  p11.paragraph_format.space_after = Pt(12)
  docx2.add_paragraph(str(x+3)+'、'+choice2[y][6])
  x+=1

 list3=random.sample(range(0,len(choice3)-1),5)
 x=1
 for y in list3:
  docx1.add_paragraph(str(x+10)+'、'+choice3[y][1])
  docx1.add_paragraph(choice3[y][2])
  docx1.add_paragraph(choice3[y][3])
  docx1.add_paragraph(choice3[y][4])
  p11=docx1.add_paragraph(choice3[y][5])
  p11.paragraph_format.space_after = Pt(12)
  docx2.add_paragraph(str(x+10)+'、'+choice3[y][6])
  x+=1

 p2 = docx1.add_paragraph()
 p2.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('二、填空题')
 run = p2.add_run('二、填空题(每题3分,共15分)')
 run.bold = True
 list2 = random.sample(range(0, len(choice5)-1), 5)
 i = 1
 for j in list2:
  docx1.add_paragraph(str(i) + '、' + choice5[j][1])
  docx2.add_paragraph(str(i) + '、' + str(choice5[j][2]))
  i += 1

 p3 = docx1.add_paragraph()
 p3.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('三、简答题')
 run = p3.add_run('三、简答题(每题10分,共20分)')
 run.bold = True
 list3 = random.sample(range(0, len(choice6)-1), 2)
 n = 1
 for m in list3:
  docx1.add_paragraph(str(n) + '、' + choice6[m][1])
  docx1.add_paragraph('\r')
  docx2.add_paragraph(str(n) + '、' + choice6[m][2])
  n += 1

 p4 = docx1.add_paragraph()
 p4.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('四、综合题')
 run = p4.add_run('四、综合题(共20分)')
 run.bold = True
 list4 = random.randint(0, len(choice7)-1)
 docx1.add_paragraph('1、' + choice7[list4][1])
 docx2.add_paragraph(choice7[list4][2])

 docx1.save(os.path.join(paper_path, '网络通信试题(%s).docx' % name))    #保存试题
 docx2.save(os.path.join(paper_path, '网络通信试题答案(%s).docx' % name))   #保存答案

def android_docx(choice1, choice2, choice4, choice5, choice6, choice8,paper_path,name):
 """生成智能终端方向的试题"""
 docx1 = Document()
 docx2 = Document()
 docx1.styles['Normal'].font.name = '宋体'          #选择字体
 docx1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')   #默认字体
 docx1.styles['Normal'].font.size = Pt(11)          #默认字号大小
 docx1.styles['Normal'].paragraph_format.space_before = Pt(0)     #默认段前间距
 docx1.styles['Normal'].paragraph_format.space_after = Pt(0)      #默认段后间距
 docx1.styles['Normal'].paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #默认单倍行距
 sec = docx1.sections[0]               # sections对应文档中的“节”
 sec.left_margin = Inches(1)              # 设置左页面边距
 sec.right_margin = Inches(1)             #设置右页面边距
 sec.top_margin = Inches(0.5)             # 设置上页面边距
 sec.bottom_margin = Inches(0.5)             #设置下页面边距

 p=docx1.add_paragraph()               #添加段落
 run = p.add_run('软件测试(智能终端)方向试题(%s)' % name)        #使用add_run添加文字
 run.font.name = '微软雅黑'              #设置字体
 run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')       #设置字体
 run.font.size = Pt(18)               #字体大小设置
 p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER      #段落文字居中设置
 docx1.add_paragraph('【说明】')             # 添加段落文字
 docx1.add_paragraph('1.笔试时间为60分钟。')
 docx1.add_paragraph('2.请将答案写在答题卡上,且不允许在试题卷上做任何涂写和标记。')
 q = docx2.add_paragraph()              # 添加段落
 run = q.add_run('软件测试(智能终端)方向试题答案(%s)' % name)       # 使用add_run添加文字
 run.font.name = '微软雅黑'              # 设置字体
 run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')       # 设置字体
 run.font.size = Pt(18)               # 字体大小设置
 q.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER      # 段落文字居中设置

 p1 = docx1.add_paragraph()
 p1.paragraph_format.space_before = Pt(12)          #设置段前间距
 docx2.add_paragraph('一、选择题')
 run = p1.add_run('一、选择题(每题3分共45分)')
 run.bold = True                 # 字体加粗
 list1=random.sample(range(0,len(choice1)-1),3)
 x=1
 for y in list1:
  docx1.add_paragraph(str(x)+'、'+choice1[y][1])
  docx1.add_paragraph(choice1[y][2])
  docx1.add_paragraph(choice1[y][3])
  docx1.add_paragraph(choice1[y][4])
  p11=docx1.add_paragraph(choice1[y][5])
  p11.paragraph_format.space_after = Pt(12)         #段后间距
  docx2.add_paragraph(str(x)+'、'+choice1[y][6])
  x+=1

 list2=random.sample(range(0,len(choice2)-1),7)
 x=1
 for y in list2:
  docx1.add_paragraph(str(x+3)+'、'+choice2[y][1])
  docx1.add_paragraph(choice2[y][2])
  docx1.add_paragraph(choice2[y][3])
  docx1.add_paragraph(choice2[y][4])
  p11=docx1.add_paragraph(choice2[y][5])
  p11.paragraph_format.space_after = Pt(12)
  docx2.add_paragraph(str(x+3)+'、'+choice2[y][6])
  x+=1

 list3=random.sample(range(0,len(choice4)-1),5)
 x=1
 for y in list3:
  docx1.add_paragraph(str(x+10)+'、'+choice4[y][1])
  docx1.add_paragraph(choice4[y][2])
  docx1.add_paragraph(choice4[y][3])
  docx1.add_paragraph(choice4[y][4])
  p11=docx1.add_paragraph(choice4[y][5])
  p11.paragraph_format.space_after = Pt(12)
  docx2.add_paragraph(str(x+10)+'、'+choice4[y][6])
  x+=1

 p2 = docx1.add_paragraph()
 p2.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('二、填空题')
 run = p2.add_run('二、填空题(每题3分,共15分)')
 run.bold = True
 list2 = random.sample(range(0, len(choice5)-1), 5)
 i = 1
 for j in list2:
  docx1.add_paragraph(str(i) + '、' + choice5[j][1])
  docx2.add_paragraph(str(i) + '、' + str(choice5[j][2]))
  i += 1

 p3 = docx1.add_paragraph()
 p3.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('三、简答题')
 run = p3.add_run('三、简答题(每题10分,共20分)')
 run.bold = True
 list3 = random.sample(range(0, len(choice6)-1), 2)
 n = 1
 for m in list3:
  docx1.add_paragraph(str(n) + '、' + choice6[m][1])
  docx1.add_paragraph('\r')
  docx2.add_paragraph(str(n) + '、' + choice6[m][2])
  n += 1

 p4 = docx1.add_paragraph()
 p4.paragraph_format.space_before = Pt(12)
 docx2.add_paragraph('四、综合题')
 run = p4.add_run('四、综合题(共20分)')
 run.bold = True
 list4 = random.randint(0, len(choice8)-1)
 docx1.add_paragraph('1、' + choice8[list4][1])
 docx2.add_paragraph(choice8[list4][2])

 docx1.save(os.path.join(paper_path, '智能终端试题(%s).docx' % name))
 docx2.save(os.path.join(paper_path, '智能终端试题答案(%s).docx' % name))

def main(ip,name,passwd,db_name):
 paper_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '试卷') #试卷存放路径
 if not os.path.exists(paper_path):
  os.mkdir(paper_path)              #创建试卷文件夹
 my = SunckSql(ip,name,passwd,db_name)           #连接数据库
 choice1 = my.get_all("select * from %s" % '计算机基础选择题')      #查询数据库中的试题
 choice2 = my.get_all("select * from %s" % '测试基础选择题')
 choice3 = my.get_all("select * from %s" % '网络通信选择题')
 choice4 = my.get_all("select * from %s" % '智能终端选择题')
 choice5 = my.get_all("select * from %s" % '填空题')
 choice6 = my.get_all("select * from %s" % '简答题')
 choice7 = my.get_all("select * from %s" % '网络通信综合题')
 choice8 = my.get_all("select * from %s" % '智能终端综合题')
 for i in range(1,4):               #同时生成3份试卷及答案
  router_docx(choice1, choice2, choice3, choice5, choice6, choice7, paper_path, i)
  android_docx(choice1, choice2, choice4, choice5, choice6, choice8, paper_path, i)

if __name__ == "__main__":
 main(ip='数据库ip地址', name='mysql账号', passwd='mysql密码', db_name='软件测试试题库')

到此这篇关于Python+MySQL随机试卷及答案生成程序的文章就介绍到这了,更多相关Python MySQL随机试卷内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 时间操作例子和时间格式化参数小结
Apr 24 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python 中random模块的常用方法总结
Jul 08 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
Apr 09 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
python实现代码审查自动回复消息
Feb 01 #Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 #Python
python 列表推导和生成器表达式的使用
Feb 01 #Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 #Python
深入理解Python变量的数据类型和存储
Feb 01 #Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 #Python
Pytorch 图像变换函数集合小结
Feb 01 #Python
You might like
数字转英文
2006/12/06 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
php编写一个简单的路由类
2011/04/13 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
学校安全教育制度
2014/01/31 职场文书
事业单位考核材料
2014/05/21 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
5.12护士节活动总结
2015/02/10 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
Python - 10行代码集2000张美女图
2021/05/23 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python