Python从MySQL数据库中面抽取试题,生成试卷


Posted in Python onJanuary 14, 2021

一、背景

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

二、准备工作

1.安装Python3

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

2.安装库

pip install python-docx==0.8.10

pip install PyMySQL==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网络编程之TCP套接字简单用法示例
Apr 09 Python
python线程池threadpool使用篇
Apr 27 Python
Django如何配置mysql数据库
May 04 Python
python中cPickle类使用方法详解
Aug 27 Python
Python类的继承用法示例
Jan 31 Python
Python列表与元组的异同详解
Jul 02 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
python zip()函数使用方法解析
Oct 31 Python
python第三方库学习笔记
Feb 07 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
DRF使用simple JWT身份验证的实现
Jan 14 #Python
如何用Python提取10000份log中的产品信息
Jan 14 #Python
python自动生成证件号的方法示例
Jan 14 #Python
用python批量移动文件
Jan 14 #Python
python用700行代码实现http客户端
Jan 14 #Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 #Python
Django扫码抽奖平台的配置过程详解
Jan 14 #Python
You might like
ftp类(myftp.php)
2006/10/09 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php导出生成word的方法
2015/12/25 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
iview同时验证多个表单问题总结
2018/09/29 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
python 换位密码算法的实例详解
2017/07/19 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
使用Python实现画一个中国地图
2019/11/23 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
领导党性分析材料
2014/02/15 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
听课评课活动心得体会
2016/01/15 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
Python OpenCV实现图形检测示例详解
2022/04/08 Python