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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
详解K-means算法在Python中的实现
Dec 05 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
Jan 09 Python
python requests.post带head和body的实例
Jan 02 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python线程threading模块用法详解
Feb 26 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
python源码剖析之PyObject详解
May 18 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
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
jquery 输入框数字限制插件
2009/11/10 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
python实现倒计时的示例
2014/02/14 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Python实现按中文排序的方法示例
2018/04/25 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python学生管理系统的实现
2020/04/05 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Paul’s Boutique官网:英国时尚手袋品牌
2018/03/31 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
ktv收银员岗位职责
2013/12/16 职场文书
打造完美自荐信
2014/01/24 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
群众路线领导对照材料
2014/08/23 职场文书
计算机实训报告范文
2014/11/05 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android