当前位置:   article > 正文

Python生成随机试卷及答案_python根据题库自动出试卷

python根据题库自动出试卷

前言

Python 是一种流行的编程语言,广泛用于数据分析。使用 Python 进行数据分析的一些主要优势包括:

  • 庞大而活跃的社区:Python 拥有庞大而活跃的用户和开发人员社区,这使得找到使用 Python 处理数据的支持和资源变得容易。
  • 丰富的库和工具:Python 拥有丰富的数据分析库和工具生态系统,包括用于数据操作、可视化和机器学习的库。
  • 高级且易于使用:Python 是一种高级编程语言,这意味着它易于阅读和编写。这使它成为数据分析的不错选择,因为它使您可以专注于数据和分析,而不是代码的低级细节。
  • 灵活性和互操作性:Python 是一种灵活的语言,可用于范围广泛的数据分析任务,从简单的数据探索到复杂的机器学习模型。它还可以与其他语言和系统互操作,这使得将 Python 集成到现有数据管道和工作流中变得容易。

Python 是数据分析的强大而流行的选择,因为它拥有庞大而活跃的社区、丰富的库和工具、高级且易于使用的语法以及灵活性和互操作性。

一、背景

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

二、准备工作

1.安装Python3

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

2.安装库

pip install python-docx

pip install xlrd

3.试题库.xlsx

开发程序前需要先收集试题,本文是将试题收集存放到Excel表中(如果题量比较大,可以存放到数据库中),格式如下:

选择题:

efd910635678235751d9b2cf3764e5e6.png

填空题/解答题/综合题:

dcd80bb2c869984cba53ad6243e02be4.png

三、代码

Test_question.py

  1. # _*_ coding:utf-8 _*_
  2. import random,xlrd,os
  3. from docx import Document
  4. from docx.shared import Inches,Pt
  5. from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING
  6. from docx.oxml.ns import qn
  7. from docx.shared import Inches
  8. def get_xlsx(sheet):
  9. "获取指定Excel数据"
  10. excel_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '软件测试试题库.xlsx') # 获取用例文件路径
  11. file = xlrd.open_workbook(excel_path) # 打开excel
  12. list = []
  13. sheet = file.sheet_by_name(sheet) # 获得指定sheet数据
  14. row_value1 =sheet.row_values(0) # 获取第1行的标题
  15. nrows = sheet.nrows # 获取当前sheet行数
  16. ncols = sheet.ncols # 获取当前sheet列数
  17. for i in range(1, nrows): # 从第2行遍历当前sheet
  18. row = sheet.row_values(i) # 获取行数据
  19. dict = {} # 创建空字典
  20. for j in range(0, ncols): # 遍历sheet列,组成字典
  21. if row_value1[j] == '序号':
  22. dict[row_value1[j]] = int(row[j])
  23. else:
  24. dict[row_value1[j]] = row[j] # 从第一列开始,将每一列的数据与第1行的数据组成一个键值对,形成字典
  25. list.append(dict) # 将字典添加list中
  26. return list
  27. def router_docx(choice1,choice2,choice3,choice5,choice6,choice7,paper_path,name):
  28. "生成网络通信方向试题及答案"
  29. docx1 = Document()
  30. docx2 = Document()
  31. docx1.styles['Normal'].font.name = '宋体' #选择字体
  32. docx1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') #默认字体
  33. docx1.styles['Normal'].font.size = Pt(11) #默认字号大小
  34. docx1.styles['Normal'].paragraph_format.space_before = Pt(0) #默认段前间距
  35. docx1.styles['Normal'].paragraph_format.space_after = Pt(0) #默认段后间距
  36. docx1.styles['Normal'].paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #默认单倍行距
  37. sec = docx1.sections[0] # sections对应文档中的“节”
  38. sec.left_margin = Inches(1) # 设置左页面边距
  39. sec.right_margin = Inches(1) #设置右页面边距
  40. sec.top_margin = Inches(0.5) # 设置上页面边距
  41. sec.bottom_margin = Inches(0.5) #设置下页面边距
  42. p=docx1.add_paragraph() #添加段落
  43. run = p.add_run('软件测试(网络通信)方向试题(%s)' % name) #使用add_run添加文字
  44. run.font.name = '微软雅黑' #设置字体
  45. run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') #设置字体
  46. run.font.size = Pt(18) #字体大小设置
  47. p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER #段落文字居中设置
  48. docx1.add_paragraph('【说明】') # 添加段落文字
  49. docx1.add_paragraph('1.笔试时间为60分钟。')
  50. docx1.add_paragraph('2.请将答案写在答题卡上,且不允许在试题卷上做任何涂写和标记。')
  51. q=docx2.add_paragraph() #添加段落
  52. run = q.add_run('软件测试(网络通信)方向试题答案(%s)' % name) #使用add_run添加文字
  53. run.font.name = '微软雅黑' #设置字体
  54. run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') #设置字体
  55. run.font.size = Pt(18) #字体大小设置
  56. q.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER #段落文字居中设置
  57. p1 = docx1.add_paragraph()
  58. p1.paragraph_format.space_before = Pt(12) #设置段前间距
  59. docx2.add_paragraph('一、选择题')
  60. run = p1.add_run('一、选择题(每题3分共45分)')
  61. run.bold = True # 字体加粗
  62. list1=random.sample(range(0,len(choice1)-1),3)
  63. x=1
  64. for y in list1:
  65. docx1.add_paragraph(str(x)+'、'+choice1[y]['题目'])
  66. docx1.add_paragraph(choice1[y]['选项A'])
  67. docx1.add_paragraph(choice1[y]['选项B'])
  68. docx1.add_paragraph(choice1[y]['选项C'])
  69. p11=docx1.add_paragraph(choice1[y]['选项D'])
  70. p11.paragraph_format.space_after = Pt(12) #段后间距
  71. docx2.add_paragraph(str(x)+'、'+choice1[y]['答案'])
  72. x+=1
  73. list2=random.sample(range(0,len(choice2)-1),7)
  74. x=1
  75. for y in list2:
  76. docx1.add_paragraph(str(x+3)+'、'+choice2[y]['题目'])
  77. docx1.add_paragraph(choice2[y]['选项A'])
  78. docx1.add_paragraph(choice2[y]['选项B'])
  79. docx1.add_paragraph(choice2[y]['选项C'])
  80. p11=docx1.add_paragraph(choice2[y]['选项D'])
  81. p11.paragraph_format.space_after = Pt(12)
  82. docx2.add_paragraph(str(x+3)+'、'+choice2[y]['答案'])
  83. x+=1
  84. list3=random.sample(range(0,len(choice3)-1),5)
  85. x=1
  86. for y in list3:
  87. docx1.add_paragraph(str(x+10)+'、'+choice3[y]['题目'])
  88. docx1.add_paragraph(choice3[y]['选项A'])
  89. docx1.add_paragraph(choice3[y]['选项B'])
  90. docx1.add_paragraph(choice3[y]['选项C'])
  91. p11=docx1.add_paragraph(choice3[y]['选项D'])
  92. p11.paragraph_format.space_after = Pt(12)
  93. docx2.add_paragraph(str(x+10)+'、'+choice3[y]['答案'])
  94. x+=1
  95. p2 = docx1.add_paragraph()
  96. p2.paragraph_format.space_before = Pt(12)
  97. docx2.add_paragraph('二、填空题')
  98. run = p2.add_run('二、填空题(每题3分,共15分)')
  99. run.bold = True
  100. list2 = random.sample(range(0, len(choice5)-1), 5)
  101. i = 1
  102. for j in list2:
  103. docx1.add_paragraph(str(i) + '、' + choice5[j]['题目'])
  104. docx2.add_paragraph(str(i) + '、' + str(choice5[j]['答案']))
  105. i += 1
  106. p3 = docx1.add_paragraph()
  107. p3.paragraph_format.space_before = Pt(12)
  108. docx2.add_paragraph('三、简答题')
  109. run = p3.add_run('三、简答题(每题10分,共20分)')
  110. run.bold = True
  111. list3 = random.sample(range(0, len(choice6)-1), 2)
  112. n = 1
  113. for m in list3:
  114. docx1.add_paragraph(str(n) + '、' + choice6[m]['题目'])
  115. docx1.add_paragraph('\r')
  116. docx2.add_paragraph(str(n) + '、' + choice6[m]['答案'])
  117. n += 1
  118. p4 = docx1.add_paragraph()
  119. p4.paragraph_format.space_before = Pt(12)
  120. docx2.add_paragraph('四、综合题')
  121. run = p4.add_run('四、综合题(共20分)')
  122. run.bold = True
  123. list4 = random.randint(0, len(choice7)-1)
  124. docx1.add_paragraph('1、' + choice7[list4]['题目'])
  125. docx2.add_paragraph(choice7[list4]['答案'])
  126. docx1.save(os.path.join(paper_path, '网络通信试题(%s).docx' % name)) #保存试题
  127. docx2.save(os.path.join(paper_path, '网络通信试题答案(%s).docx' % name)) #保存答案
  128. def android_docx(choice1, choice2, choice4, choice5, choice6, choice8,paper_path,name):
  129. """生成智能终端方向的试题"""
  130. docx1 = Document()
  131. docx2 = Document()
  132. docx1.styles['Normal'].font.name = '宋体' #选择字体
  133. docx1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') #默认字体
  134. docx1.styles['Normal'].font.size = Pt(11) #默认字号大小
  135. docx1.styles['Normal'].paragraph_format.space_before = Pt(0) #默认段前间距
  136. docx1.styles['Normal'].paragraph_format.space_after = Pt(0) #默认段后间距
  137. docx1.styles['Normal'].paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #默认单倍行距
  138. sec = docx1.sections[0] # sections对应文档中的“节”
  139. sec.left_margin = Inches(1) # 设置左页面边距
  140. sec.right_margin = Inches(1) #设置右页面边距
  141. sec.top_margin = Inches(0.5) # 设置上页面边距
  142. sec.bottom_margin = Inches(0.5) #设置下页面边距
  143. p=docx1.add_paragraph() #添加段落
  144. run = p.add_run('软件测试(智能终端)方向试题(%s)' % name) #使用add_run添加文字
  145. run.font.name = '微软雅黑' #设置字体
  146. run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') #设置字体
  147. run.font.size = Pt(18) #字体大小设置
  148. p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER #段落文字居中设置
  149. docx1.add_paragraph('【说明】') # 添加段落文字
  150. docx1.add_paragraph('1.笔试时间为60分钟。')
  151. docx1.add_paragraph('2.请将答案写在答题卡上,且不允许在试题卷上做任何涂写和标记。')
  152. q = docx2.add_paragraph() # 添加段落
  153. run = q.add_run('软件测试(智能终端)方向试题答案(%s)' % name) # 使用add_run添加文字
  154. run.font.name = '微软雅黑' # 设置字体
  155. run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 设置字体
  156. run.font.size = Pt(18) # 字体大小设置
  157. q.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER # 段落文字居中设置
  158. p1 = docx1.add_paragraph()
  159. p1.paragraph_format.space_before = Pt(12) #设置段前间距
  160. docx2.add_paragraph('一、选择题')
  161. run = p1.add_run('一、选择题(每题3分共45分)')
  162. run.bold = True # 字体加粗
  163. list1=random.sample(range(0,len(choice1)-1),3)
  164. x=1
  165. for y in list1:
  166. docx1.add_paragraph(str(x)+'、'+choice1[y]['题目'])
  167. docx1.add_paragraph(choice1[y]['选项A'])
  168. docx1.add_paragraph(choice1[y]['选项B'])
  169. docx1.add_paragraph(choice1[y]['选项C'])
  170. p11=docx1.add_paragraph(choice1[y]['选项D'])
  171. p11.paragraph_format.space_after = Pt(12) #段后间距
  172. docx2.add_paragraph(str(x)+'、'+choice1[y]['答案'])
  173. x+=1
  174. list2=random.sample(range(0,len(choice2)-1),7)
  175. x=1
  176. for y in list2:
  177. docx1.add_paragraph(str(x+3)+'、'+choice2[y]['题目'])
  178. docx1.add_paragraph(choice2[y]['选项A'])
  179. docx1.add_paragraph(choice2[y]['选项B'])
  180. docx1.add_paragraph(choice2[y]['选项C'])
  181. p11=docx1.add_paragraph(choice2[y]['选项D'])
  182. p11.paragraph_format.space_after = Pt(12)
  183. docx2.add_paragraph(str(x+3)+'、'+choice2[y]['答案'])
  184. x+=1
  185. list3=random.sample(range(0,len(choice4)-1),5)
  186. x=1
  187. for y in list3:
  188. docx1.add_paragraph(str(x+10)+'、'+choice4[y]['题目'])
  189. docx1.add_paragraph(choice4[y]['选项A'])
  190. docx1.add_paragraph(choice4[y]['选项B'])
  191. docx1.add_paragraph(choice4[y]['选项C'])
  192. p11=docx1.add_paragraph(choice4[y]['选项D'])
  193. p11.paragraph_format.space_after = Pt(12)
  194. docx2.add_paragraph(str(x+10)+'、'+choice4[y]['答案'])
  195. x+=1
  196. p2 = docx1.add_paragraph()
  197. p2.paragraph_format.space_before = Pt(12)
  198. docx2.add_paragraph('二、填空题')
  199. run = p2.add_run('二、填空题(每题3分,共15分)')
  200. run.bold = True
  201. list2 = random.sample(range(0, len(choice5)-1), 5)
  202. i = 1
  203. for j in list2:
  204. docx1.add_paragraph(str(i) + '、' + choice5[j]['题目'])
  205. docx2.add_paragraph(str(i) + '、' + str(choice5[j]['答案']))
  206. i += 1
  207. p3 = docx1.add_paragraph()
  208. p3.paragraph_format.space_before = Pt(12)
  209. docx2.add_paragraph('三、简答题')
  210. run = p3.add_run('三、简答题(每题10分,共20分)')
  211. run.bold = True
  212. list3 = random.sample(range(0, len(choice6)-1), 2)
  213. n = 1
  214. for m in list3:
  215. docx1.add_paragraph(str(n) + '、' + choice6[m]['题目'])
  216. docx1.add_paragraph('\r')
  217. docx2.add_paragraph(str(n) + '、' + choice6[m]['答案'])
  218. n += 1
  219. p4 = docx1.add_paragraph()
  220. p4.paragraph_format.space_before = Pt(12)
  221. docx2.add_paragraph('四、综合题')
  222. run = p4.add_run('四、综合题(共20分)')
  223. run.bold = True
  224. list4 = random.randint(0, len(choice8)-1)
  225. docx1.add_paragraph('1、' + choice8[list4]['题目'])
  226. docx2.add_paragraph(choice8[list4]['答案'])
  227. docx1.save(os.path.join(paper_path, '智能终端试题(%s).docx' % name))
  228. docx2.save(os.path.join(paper_path, '智能终端试题答案(%s).docx' % name))
  229. def main():
  230. paper_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '试卷') #试卷存放路径
  231. if not os.path.exists(paper_path):
  232. os.mkdir(paper_path)
  233. choice1 = get_xlsx('计算机基础') #从excel中获得试题
  234. choice2 = get_xlsx('测试基础')
  235. choice3 = get_xlsx('选择题(网络通信)')
  236. choice4 = get_xlsx('选择题(智能终端)')
  237. choice5 = get_xlsx('填空题')
  238. choice6 = get_xlsx('简答题')
  239. choice7 = get_xlsx('综合题(网络通信)')
  240. choice8 = get_xlsx('综合题(智能终端)')
  241. for i in range(1,4): #同时生成3份试卷及答案
  242. router_docx(choice1, choice2, choice3, choice5, choice6, choice7, paper_path, i)
  243. android_docx(choice1, choice2, choice4, choice5, choice6, choice8, paper_path, i)
  244. if __name__ == "__main__":
  245. main()

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/640786
推荐阅读
相关标签
  

闽ICP备14008679号