一、背景

本文章主要是分享如何使用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随机试卷及答案生成程序.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随机试卷及答案生成程序的更多相关文章

  1. Python-zip()函数

    Python-zip()函数的一些相关知识Python内置help()的解释返回一个元组迭代器,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素。当最短的可迭代输入耗尽时,迭代器将停止。使用单个可迭代参数,它将返回1元组的迭代器。没有参数,它将返回一个空的迭代器。 功能演示uppercase......

  2. Python爬虫scrapy框架Cookie池(微博Cookie池)的使用

    下载代码Cookie池(这里主要是微博登录,也可以自己配置置其他的站点网址)下载代码GitHub:https://github.com/Python3WebSpider/CookiesPool下载安装过后注意看网页下面的相关基础配置和操作!!!!!!!!!!!!!自己的设置主要有下面几步:1、配置其......

  3. pytorch 实现冻结部分参数训练另一部分

    1)添加下面一句话到模型中for p in self.parameters():p.requires_grad = False比如加载了resnet预训练模型之后,在resenet的基础上连接了新的模快,resenet模块那部分可以先暂时冻结不更新,只更新其他部分的参数,那么可以在下面加入上面那句话......

  4. 五分钟学会怎么用Pygame做一个简单的贪吃蛇

    Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发。我们今天将利用它来制作一款大家基本都玩过的小游戏——贪吃蛇。一、需要导入的包?123import pygameimport timeimport randompygame:获取图形组件构建游戏time:主要......

  5. python jinja2模板的使用

    模板的用处jinja2 可以用来修改配置文件,把配置文件的关键地方可以用变量来进行替换模板语法模板语法和django的模板语法差不多 在jinja2中,存在三种语法:控制结构{% %}变量取值{{ }}注释{# #}for 循环{% for user in users %}{{user.userna......

  6. Python jieba库分词模式实例用法

    在中文分词中,jiebe库是最为常见的,主要的原因还是它独特的支持分词模式如:精确模式、全模式、搜索引擎模式。也对应着三种方式,包括jieba.cut()方法、jieba.lcut()方法、jieba.cut_for_search()方法。下面就为大家实例操作这些分词模式,以及方法的使用,一起来了解......

  7. python生成二维码

    python生成二维码需要用到的包pip install qrcode 代码:import qrcode from PIL import Image # 如果需要在二维码中添加图片logo需要 # 模块导入 data = "www.baidu.com" img_name = '二......

  8. python用分数表示矩阵的方法实例

    前言在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通过添加一行代码来实现。1、函数及参数解释set_printoptions()——控制输出方式formatter——通用格式化输出Fraction(x).limi......

  9. Python学习(3) (变量的基本使用、定义、类型、计算、类型转换、输入输出、命名)

    Python学习(3)一、python变量的定义二、pycharm单步执行查看变量值三、python变量的类型四、python变量间的计算五、python变量的输入输出1. input 函数用法2. 类型转换函数3. 变量的格式化输出六、python变量的命名1.标识符2.关键字3.变量的命名规则程......

  10. Python学习(2) (代码运行的常见错误、python解释器、注释方法、算数运算符)

    Python学习(2)一、python代码运行的常见错误二、python解释器三、python注释方法1.注释的作用2.单行注释(行注释)3.多行注释(块注释)四、python的算数运算符1.算数运算符2.算数运算符的优先级一、python代码运行的常见错误1.手误。例如:pirnt(“hi wor......

随机推荐

  1. Python实现京东抢秒杀功能

    京东购物车抢购商品1.Python的下载和安装这里由于我们代码是基于Python来执行的所以我们这里需要2个东西:一个是Python本身,另一个是pycharm,只需要这两个哦!!!网上有很多教程,所以我在这里就不一一赘述了2.系统环境,模块的配置安装好Python,请移步我的另一篇博客,根据前面的......

  2. JavaScript this关键字的深入详解

    一、前言this关键字是JavaScript中最复杂的机制之一。它是一个很特别的关键字,被自动定义在所有函数的作用域中。对于那些没有投入时间学习this机制的JavaScript开发者来说,this的绑定一直是一件非常令人困惑的事。二、了解this学习this的第一步是明白this既不指向函数自身也......

  3. JavaScript Html实现移动端红包雨功能页面

    本文实例为大家分享了Html实现移动端红包雨功能页面的具体代码,供大家参考,具体内容如下实现效果如下:具体代码如下html部分:红包雨demo.css为初始化css,可以不加index.css部分body{width: 100%;height: 100%;background-image: url(/Python/......

    ____
  4. ________
  5. nodejs中的文件系统____

    、目录简介nodejs中的文件系统模块Promise版本的fs文件描述符fs.stat文件状态信息fs的文件读写fs的文件夹操作path操作简介nodejs使用了异步IO来提升服务端的处理效率。而IO中一个非常重要的方面就是文件IO。今天我们会详细介绍一下nodejs中的文件系统和IO操作。node......

  6. 超有用的linux笔记

    名词解释根目录说明tree -L 1.├── bin -> usr/bin # 英语binary的缩写,表示”二进制文件“,bin目录包含了会被所有用户使用的可执行程序├── boot # 英语boot表示”启动“,boot目录包含与Linux启动密切相关的文件├── dev # 英语devi......

  7. synchronized详解

    synchronized是Java多线程中元老级的锁,也是面试的高频考点,让我们来详细了解synchronized吧。在Java中,synchronized锁可能是我们最早接触的锁了,在 JDK1.5之前synchronized是一个重量级锁,相对于juc包中的Lock,synchronized显得......

  8. 解读Python的文件读写

    前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。PS:如有需要Python学习资料的小伙伴可以加下Python快乐交流群:11362015451.概述Python中内置了文件读写的功能核心:读写文件其实请求操作系统打开一个文件对象【文件描述符】......

  9. PostgreSQL 使用raise函数打印字符串

    raise函数在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line()。用法如下:raise notice 'My name is %, I am a %.', 'Lewis', 'cod......

  10. C# 忽略大小写进行字符串比较

    使用场景字符串比较在EF或者其他地方使用的时候,字符串的比较非常常见。使用全部转化为大写或者小写进行比较,有时候并不能满足使用需求。所以使用另外的字符串比较非常有意义。代码示例class Program{static void Main(string[] args){CompareInfo Comp......

  11. python基于opencv实现人脸识别

    将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别。识别图像中的人脸#coding:utf-8import cv2 as cv# 读取原始图像img = cv.imread('face.png')# 调用熟悉的人脸分类器 ......