一、背景

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

二、准备工作

1.安装Python3

2.安装库

pip install python-docx==0.8.10

pip install PyMySQL==1.0.2

3.试题库.xlsx

开发程序前需要先收集试题,本文是将试题收集存放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抽取题目生成试卷的资料请关注脚本之家其它相关文章!

mysql题库随机抽取试题_Python从MySQL数据库中面抽取试题,生成试卷相关推荐

  1. 二级MySQL,未来教育MySQL题库,15套试卷,sql题答案。

    未来教育MySQL题库,15套试卷,sql题答案. 一. 1.insert into tb_dept values('D4','公关部','Liming','010-82953306');2.alte ...

  2. 题库随机出题(python+excel)

    这段练习笔记的代码实现使用了Pandas库来读取Excel数据,并通过随机数来随机选择一行作为题目,然后将题目和选项输出到控制台,让用户输入答案并判断是否正确. 这里简单解释一下代码的实现过程: 首先 ...

  3. 清空MySQL单库下所有表数据 || 删除MySQL单库下所有表

    一.清空MySQL单库下所有表数据 -- 清空MySQL单库下所有表数据 SELECT CONCAT('truncate table ',TABLE_NAME,';') AS PLEASE_EXEC_ ...

  4. mysql升级后将旧数据迁移到新 数据库中

    mysql升级后将旧数据迁移到新 数据库中 1.将原来数据库进行导出成.sql文件 例:StudentSql.sql 2.进入新数据库的bin目录下 复制bin目录 3.cmd进入bin目录下(需管理 ...

  5. python建立题库随机抽题,用Python读取Excel题库随机组成Word版本试卷

    Excel题目类型有单选.多选.判断,其中多选题最多包含6个选项,判断题只有两个选项(A:正确,B:错误) 此程序将随机抽取单选题20题,多选题10题,判断题20题,组成一张试卷. 运行程序后,将得到 ...

  6. 计算机二级考试题是题库随机抽吗,计算机二级题目是题库原题吗,计算机二级题目是随机抽的吗...

    计算机二级题目是题库原题吗,计算机二级题目是随机抽的吗 2021-04-2011:07:30 来源: 作者:wangziyang office的话选择题不用看的,三道操作题都是原题.学完选择题要花很多 ...

  7. 阿里发布内部(面试官)题库:2022年Java社招岗(正式版)面试题

    阿里巴巴2022年Java架构师岗面试题(正式版) 这不马上就是金三银四的面试跳槽季了嘛,马士兵老师也是通过一些小手段为大家拿到了一份阿里巴巴2022年Java架构师岗面试题(正式版)现在分享给大家, ...

  8. python 用题库自动答题器_python实现自动刷题

    使用Python实现云豆网自动刷题 这些是一大佬写的我就解读一下 所有代码全是Py3 要有一些Python基础emmm不用太多 不懂就问我的QQ:2025450852 大体思路: 控制浏览器模拟点击 ...

  9. MySQL百一题库_「灵魂拷问」MySQL面试高频一百问(工程师方向)

    前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...

最新文章

  1. 详解 CSS 属性 - 伪类和伪元素的区别
  2. EMC Networker与mhvtl虚拟磁带库的结合on rhel5.5
  3. python 入门第六课 class面向对象OOP
  4. 奥托尼克斯接近开关型号_12月23日NBA | 骑士VS老鹰、尼克斯VS奇才、开拓者VS鹈鹕...
  5. JZOJ 5904. 【NOIP2018模拟10.15】刺客信条(AC)
  6. 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂
  7. mysql默认时间怎么不同步_MYSQL 更新时间自动同步与创建时间默认值共存问题
  8. OpenCV系列(一)之图像平滑
  9. hdu 4415 Assassin’s Creed 贪心
  10. flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?
  11. React Native之七牛
  12. TCPUDP测试工具
  13. stm32码盘传感器_STM32电机测速(正交或者霍尔编码器)
  14. 会员管理系统单机版哪里有?
  15. 厦门大学国家奖学金答辩PPT模板
  16. 自己做量化交易软件(36)小白量化实战9--小白量化回测面板设计
  17. 公式冒号是什么意思_冒号是什么意思
  18. linux php muma,php实现Linux服务器木马排查及加固功能
  19. 数据挖掘—Autistic Spectrum Disorder Screening Data For Children
  20. 矩阵分析 (二) 内积空间

热门文章

  1. 小程序连接公众号文章
  2. 2021 各式免費 sorce code final
  3. CentOS系统基于iPXE搭建同时支持BIOS和UEFI启动的PXE网络装机环境
  4. 秒上手!使用Arduino控制基于WS2812B的LED灯条
  5. 蓝桥杯单片机省赛第十一届赛题二
  6. 咸鱼Maya笔记—骨骼的基本操作
  7. 基于CVSS3.1的一种评估框架
  8. 原生js 弹出框;弹出效果 定时关闭
  9. 逻辑网络设计——三层网络结构(核心汇聚接入)学习心得
  10. 试玩Flutter:写了个无聊的App(附Flutter感受)