使用python处理题库表格并转化为word形式的实现


Posted in Python onApril 14, 2020

前言

亲人工作考试,公司给的题库好像是直接从数据库导出的表格Excel形式,在移动端上非常难看,需要不断左右上下滑动,看不了多少题眼就瞎了,遂主动请缨编写python脚本解决之。

原本给的题库在手机上横屏显示是这样的↓↓↓(想象一下是在手机上)无比恶心

使用python处理题库表格并转化为word形式的实现

我的工作

公司给出的格式是.xlsx的(Excel表格的默认格式),盲猜是直接从答题数据库导出的,表名和属性名应该是稍微做了从英文到中文的改变,然后,就直接这样发给员工了…
表格有八个,放在一个文件夹下,由于不同工种的题表头是相同的,因此可以编写代码统一处理。
首先是获取题库存放路径,便于对指定路径文件处理:

to_path = r'D:\python_project\TableAfterProcessing'
dir_path = r'D:\python_project\题库名\backup'
name_list = []
for i in os.listdir(dir_path):
  name_list.append(i)

之前学过python库pandas的基本操作,由于一个月前数模美赛的时候使用过并使用博客记录,因此总体来说还不算生疏。
关于Excel表格的读取,作者首先手动将表格转换成了.csv格式(表格不多,因此没必要编写代码了,当然,如果愿意还是可以的)。

观察到表格中知识点一栏数据完全相同,选项个数一栏并没有什么参考价值,因此去掉这两行,只保留题型,题干,选项,答案。

然后就是采用pandas将缺失值null变为空字符串' ',这样的目的是避免将null这个字符写入到word。

for file_name in name_list:
  # 文件读取路径
  from_path = os.path.join(dir_path, file_name)
  p_data = pd.read_csv(from_path, engine='python', usecols=['题型', '题干', '选项', '答案'])
  p_data = p_data.where(p_data.notnull(), '')

经过对数据的处理后预处理后,表格便只剩下了四列数据,清爽了很多。
然而光是这样还是不够的,毕竟涉及到手机端浏览表格就得放大,滑动,一不小心点到格子里去还要点出来,对用户很不友好。
因此,我决定将表格数据导入到word,变成常见的题型格式。
这就需要用到python的docx库,关于这个库的讲解就不在这里赘述了,笔者也是通过百度新学习的,这里主要说一下设计和逻辑。

1.题型归类

题型分为单选题,多选题,判断题。表格中对于每一个题都有其对应的类型描述,无外这三种。同时,同一类的数据是聚集在一起的,因此,可以设置标志位记录前一个题目所属的题型,如果当前类别和上一个相同,则只需要写入题号题干等;如果不同,就使用docx中的Document.add_heading()方法新建立一个标题。

2.正确答案标红

如果单纯的将答案写在每一个题的后面或者开头,这样固然可以,但显然不够直观。一种友好的方式是将正确答案标为红色,这样便能直观的看出。
如何实现呢?

原本表格中的答案是以'ABC'这样的方式给出的,python中自带关键字in可以用来判断A串是否连续存在于B中,例如'as' in 'asda',返回值是True,而'sa' in 'asda'返回值则是False
故而拿到了选项后,只需要使用str.split()方法切分字符串,再依次判断每个字符串的首个字符是否存在于正确答案字符串中就可以了。

拿这组数据举例:

使用python处理题库表格并转化为word形式的实现

给定选项有:A.劳动生产率

B.产品质量

C.产量

D.工作质量
因此切分后的字符串列表是这样的['A.劳动生产率', 'B.产品质量', 'C.产量',' D.工作质量']
正确答案字符串为'A,B,D'
取其中第一个字符串'A.劳动生产率',首个字符为'A',A存在于'A,B,D'中,证明这条答案是正确的,因此调用docx库自带的方法将字符串写入到word并标记为红色。

# 若为判断题则将答案写入
if q_type == '判断题':
  document.add_paragraph(u'答案:' + str(r_ans) + '\n')
# 否则只标红正确选项
else:
  res_list = (str(r_choose)).split()
  # print(res_list)
  p.add_run('\n')
  for res in res_list:
    run = p.add_run(str(res) + ' ')
    # print(res[0])
    if res[0] in r_ans:
      run.font.color.rgb = RGBColor(255,0,0)
  p.add_run('\n')

经过我一通操作后变成了这样↓↓↓

单选题

使用python处理题库表格并转化为word形式的实现

多选题

使用python处理题库表格并转化为word形式的实现

判断题

使用python处理题库表格并转化为word形式的实现

代码

这里放上整个代码,若有需要的同学可以作为参考。

# *-* encoding:utf-8 *-*
import os
import pandas as pd
from docx import Document
from docx.oxml.ns import qn
from docx.shared import RGBColor


to_path = r'D:\python_project\TableAfterProcessing'
dir_path = r'D:\python_project\XXXX\backup'
name_list = []
for i in os.listdir(dir_path):
  name_list.append(i)

print(name_list)
# ['D:\\python_project\\XXX考试题库\\backup\\ssss.csv']

for file_name in name_list:
  # 文件读取路径
  from_path = os.path.join(dir_path, file_name)
  # 创建文档对象,设置字体
  document = Document()
  document.styles['Normal'].font.name = u'宋体'
  document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
  print((file_name))
  p_data = pd.read_csv(from_path, engine='python', usecols=['题型', '题干', '选项', '答案'])
  p_data = p_data.where(p_data.notnull(), '')
  # 读取指定几列
  q_type = ''
  for index in range(len(p_data)):
    r_type = p_data['题型'][index]
    r_cont = p_data['题干'][index]
    r_choose = p_data['选项'][index]
    r_ans = p_data['答案'][index]
    # print(str(r_choose))
    # 判断当前题型,确定是否创建对应类别标题
    if r_type is not q_type:
      q_type = r_type
      document.add_heading(q_type)
    # 将题号以及题干写入文档
    p = document.add_paragraph(str(index+1) + r'.' + str(r_cont))
    # 写入选项
    # if str(r_choose).strip() is not '':
    #   document.add_paragraph(str(r_choose))
    # 若为判断题则将答案写入
    if q_type == '判断题':
      document.add_paragraph(u'答案:' + str(r_ans) + '\n')
    # 否则只标红正确选项
    else:
      res_list = (str(r_choose)).split()
      # print(res_list)
      p.add_run('\n')
      for res in res_list:
        run = p.add_run(str(res) + ' ')
        # print(res[0])
        if res[0] in r_ans:
          run.font.color.rgb = RGBColor(255,0,0)
      p.add_run('\n')
      # p.add_run('')
      # 切分答案字符串
    # pass
  # 写入对应路径
  document.save(os.path.join(to_path, file_name[0:-4]+'.docx'))

到此这篇关于使用python处理题库表格并转化为word形式的实现的文章就介绍到这了,更多相关python表格转化为word内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过定义一个类实例作为ftp回调方法
May 04 Python
python的mysqldb安装步骤详解
Aug 14 Python
Python 基础教程之str和repr的详解
Aug 20 Python
python处理multipart/form-data的请求方法
Dec 26 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
python多线程并发及测试框架案例
Oct 15 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
pycharm sciview的图片另存为操作
Jun 01 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
python从Oracle读取数据生成图表
Oct 14 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 #Python
Jupyter加载文件的实现方法
Apr 14 #Python
利用jupyter网页版本进行python函数查询方式
Apr 14 #Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 #Python
python matplotlib.pyplot.plot()参数用法
Apr 14 #Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 #Python
简单了解pytest测试框架setup和tearDown
Apr 14 #Python
You might like
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
用jquery存取照片的具体实现方法
2013/06/30 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
python如何查看安装了的模块
2020/06/23 Python
python反扒机制的5种解决方法
2021/02/06 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
行政办公室岗位职责
2014/03/18 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
教师节寄语2015
2015/03/23 职场文书
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python