当前位置:   article > 正文

python自动化办公-docx模块操作Word文档的简单案列_python 提取word中自动编码2、后面的内容

python 提取word中自动编码2、后面的内容

前言

前段时间有小伙伴问二狗,怎么把一个Word文档的题库,写一个python脚本提取到Excel里 .由于数据全是选择题,且文本很有规律,不是很复杂.所以今天二狗就通过本篇文章来分享下二狗的思路和代码.

word文档数据


编程环境

1.文中电脑操作系统:win10


2.文中所使用的python模块:

(1).os (python自带模块,不需要pip安装)

(2).re (python自带模块,不需要pip安装)

(3).docx (第三方模块,需要pip安装)

安装命令:pip install -i https://
pypi.tuna.tsinghua.edu.cn/simple
python-docx

注意:我们这次要用到的第三方库,就是专门为docx格式的word文档而生的。如果你手头需要处理的是doc格式的word文档,你可以打开word,将其另存为 docx的格式。【注意word 97以上版本支持存储docx文件】

(4).openpyxl (第三方模块,需要pip安装)

安装命令:pip install -i https://
pypi.tuna.tsinghua.edu.cn/simple
openpyxl

3.文中数据源文件:选择题.docx(如果需要,请后台私信)

4.文中所使用的IDE:VSCODE(安装Jupyter插件)

文档数据结构剖析及代码思路

文档结构

(1)提取答案:由于答案是红色标记的,我们可以读取每一段落的样式,红色的段落就是答案.

分题

(2)分题:这个稍微有点复杂,二狗通过处理每一题前面的题号,来进行的,具体详见代码.

一行2选项

(3)一行2选项:通过split来分割,具体详见代码.

代码拆检

  1. import os
  2. import re
  3. import docx
  4. import openpyxl

  1. now_path = os.getcwd() # 获取当前ipynb文件的路径
  2. doc_file = '选择题.docx' # 要提取的doc文件名
  3. excel_file = '选择题.xlsx' # 保存为Excel的文件名
  4. wb = openpyxl.Workbook() # 实例化Excel对象
  5. ws = wb.active # 创建Excel活动表格
  6. tab_head = ['序号','题目','选项1','选项2','选项3','选项4','答案'] #定义Excel表头
  7. ws.append(tab_head) #表头写入Excel
  8. start_flag = True # 设置开始状态
  9. content_list=[] #初始化内容列表

  1. def jion_path(file_path,file_name):
  2. '''
  3. 功能:拼接文件路径
  4. :param file_path: 固定参数,定义拼接的文件路径
  5. :param file_name: 固定参数,定义拼接的文件名称
  6. :return:返回拼接好的文件路径
  7. '''
  8. return os.path.join(file_path,file_name)

这里二狗定义了一个无聊的函数


  1. doc = docx.Document(
  2. jion_path(file_path=now_path,file_name=doc_file)
  3. ).paragraphs # 读取word文档.doc文件 如是.docx文件 需把文件另存为.doc文件

读取docx文档,得到一个段落列表.


  1. for content in filter(lambda x: bool(x.text) ,doc[1:]): #遍历段落列表
  2. row = content.text.strip('试题') #去除每一题的'试题'2字
  3. row_list = re.split(r'^\d+\W',row) # 正则切割段落文本

doc[1:] 从第二行开始读取,不读取第一行的大标题

filter(lambda x: bool(x.text) ,doc[1:])这里是过滤为空值的段落.

过滤效果

没有过滤的效果 可以看见明显空值

strip和正则切割后的效果


  1. if row_list[1:]:#判断切割后的列表的第一个元素,是否有值 Ture为题目 False为答案选项
  2. if start_flag: # 判断是否为第一行
  3. content_list += row_list[1:] # 如果是第一行就题目添加进空列表content_list
  4. start_flag = False # 重制start_flag为False
  5. else: # 如果不是第一行
  6. content_list += answer #把answer答案列表添加进content_list
  7. content_list.insert(0,number) # content_list列表里第一个位置插入序号
  8. ws.append(content_list) # 把content_list列表写入Excel里
  9. number += 1 #更新下一题的序号
  10. content_list=[] # 重置content_list列表为空,准备添加下一题
  11. content_list += row_list[1:] # 把题目添加进空列表content_list
  12. else:# 这里利用python的切片机制 row_list里只有一个元素时 row_list[1:]切片会返回
  13. row_list = [i.strip() for i in re.split(r'\s{4}',row_list[0]) if i ]
  14. # 处理一行2答案选项的情况
  15. content_list += row_list # 把ABCD选项文本添加进content_list

超过列表长度的切片方法会返回空列表

处理一行2个答案选项的效果

if row_list[1:] 超过列表长度的切片方法会返回空列表 不会抛出异常


  1. for run in content.runs: #遍历每个段落的文本样式 找的为红色的答案
  2. answer_color = str(run.font.color.rgb) # 获取每个段落的字体颜色
  3. if answer_color == 'FF0000' : # 判断此段落的文字是否为红色
  4. answer = re.findall(r'[A-D]{1}',run.text)#提取答案项对应的字母
  5. break # 停止遍历每个段落的文本样式

找到答案项

此处的break只打破for run in content.runs的循环


  1. else: # for content in filter(lambda x: bool(x.text) ,doc[1:]) 循环结束时
  2. content_list += answer #把answer答案列表添加进content_list
  3. content_list.insert(0,number) # content_list列表里第一个位置插入序号
  4. ws.append(content_list) # 最后一题写入EXcel里
  5. wb.save(jion_path(now_path,excel_file))# 保存文件

因为二狗写的脚本,是通过处理下一题时来保存的上一题 ,所以最后一题的保存是要单独处理一下.


完整代码

  1. import os
  2. import re
  3. import docx
  4. import openpyxl
  5. now_path = os.getcwd() # 获取当前ipynb文件的路径
  6. doc_file = '选择题.docx' # 要提取的doc文件名
  7. excel_file = '选择题.xlsx' # 保存为Excel的文件名
  8. wb = openpyxl.Workbook() # 实例化Excel对象
  9. ws = wb.active # 创建Excel活动表格
  10. tab_head = ['序号','题目','选项1','选项2','选项3','选项4','答案'] #定义Excel表头
  11. ws.append(tab_head) #表头写入Excel
  12. start_flag = True # 设置开始状态
  13. content_list=[] #初始化内容列表
  14. def jion_path(file_path,file_name):
  15. '''
  16. 功能:拼接文件路径
  17. :param file_path: 固定参数,定义拼接的文件路径
  18. :param file_name: 固定参数,定义拼接的文件名称
  19. :return:返回拼接好的文件路径
  20. '''
  21. return os.path.join(file_path,file_name)
  22. doc = docx.Document(
  23. jion_path(file_path=now_path,file_name=doc_file)
  24. ).paragraphs # 读取word文档.doc文件 如是.docx文件 需把文件另存为.doc文件
  25. number= 1 #初始化序号
  26. for content in filter(lambda x: bool(x.text) ,doc[1:]): #遍历段落列表
  27. row = content.text.strip('试题') #去除每一题的'试题'2字
  28. row_list = re.split(r'^\d+\W',row) # 正则切割段落文本
  29. if row_list[1:]:#判断切割后的列表的第一个元素,是否有值 Ture为题目 False为答案选项
  30. if start_flag: # 判断是否为第一行
  31. content_list += row_list[1:] # 如果是第一行就题目添加进空列表content_list
  32. start_flag = False # 重制start_flag为False
  33. else: # 如果不是第一行
  34. content_list += answer #把answer答案列表添加进content_list
  35. content_list.insert(0,number) # content_list列表里第一个位置插入序号
  36. ws.append(content_list) # 把content_list列表写入Excel里
  37. number += 1 #更新下一题的序号
  38. content_list=[] # 重置content_list列表为空,准备添加下一题
  39. content_list += row_list[1:] # 把题目添加进空列表content_list
  40. else:# 这里利用python的切片机制 row_list里只有一个元素时 row_list[1:]切片会返回
  41. row_list = [i.strip() for i in re.split(r'\s{4}',row_list[0]) if i ]
  42. # 处理一行2答案选项的情况
  43. content_list += row_list # 把ABCD选项文本添加进content_list
  44. for run in content.runs: #遍历每个段落的文本样式 找的为红色的答案
  45. answer_color = str(run.font.color.rgb) # 获取每个段落的字体颜色
  46. if answer_color == 'FF0000' : # 判断此段落的文字是否为红色
  47. answer = re.findall(r'[A-D]{1}',run.text)#提取答案项对应的字母
  48. break # 停止遍历每个段落的文本样式
  49. else: # for content in filter(lambda x: bool(x.text) ,doc[1:]) 循环结束时
  50. content_list += answer #把answer答案列表添加进content_list
  51. content_list.insert(0,number) # content_list列表里第一个位置插入序号
  52. ws.append(content_list) # 最后一题写入EXcel里
  53. wb.save(jion_path(now_path,excel_file))# 保存文件

最终效果

结语

以上汇报完毕,下篇文章再见.(如需文中数据资料请后台私信)

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

闽ICP备14008679号