本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

作者:小小明

来源:菜J学Python

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

https://space.bilibili.com/523606542

需求

有一个下面这种形式的word表格:

希望能转换为下面这种格式的excel表格:

测试word文档读取

先测试一个word文档前1页的数据读取:

from docx import Documentdoc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
for i, paragraph in enumerate(doc.paragraphs[:55]):print(i, paragraph.text)

从读取效果上看,各行文本数据都能很顺利的获取到。

匹配题型、题目和具体的选项

现在我们需要做的是就是匹配题型、题目和具体的选项,观察可以发现规律:

  1. 题型以大写数字开头
  2. 题目以普通数字+.开头
  3. 选项以括号+字母开头

额外需要注意的:

开头几行文本也存在普通数字+.开头的,需要直接排除。

第7题的题目,和第19题的选项存在一些特殊的空白字符需要排除,

括号和小数点都同时存在半角和全角两种情况。

对于需要注意的第二点:

查看一下这2处的空白字符:

doc.paragraphs[21].text

'7.(\xa0\xa0)是第一家实施六西格玛管理的公司。\xa0'

doc.paragraphs[49].text

'(A)参数设计 (B)常量设计\u3000 (C)变量设计\u3000\u3000 (D)系统设计'

发现分别是\xa0和\u3000。

整理好大致思路,我组织一下处理代码:

import re
from docx import Documentdoc = Document("编号02 质检员高级技师(一级)理论试卷.docx")black_char = re.compile("[\s\u3000\xa0]+")chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
title_rule = re.compile("\d+.")
option_rule = re.compile("\([ABCDEF]\)")
option_rule_search = re.compile("\([ABCDEF]\)[^(]+")# 从word文档的“一、单项选择题”开始遍历数据
for paragraph in doc.paragraphs[5:25]:#  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间二个空格line = black_char.sub("", paragraph.text).replace("(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")# 对于空白行就直接跳过ifnot line:continueif title_rule.match(line):print("题目", line)elif option_rule.match(line):print("选项", option_rule_search.findall(line))else:chinese_nums_match = chinese_nums_rule.match(line)if chinese_nums_match:print("题型", chinese_nums_match.group(1))

从目前测试结果来看没有问题。

保存匹配到的数据到结构化字典

现在我打算将当前匹配出来的文本数据存储成字典形式的结构化数据,字典结构的设计如下:

根据上述设计完善代码:

import re
from docx import Document
from collections import OrderedDictdoc = Document("编号02 质检员高级技师(一级)理论试卷.docx")black_char = re.compile("[\s\u3000\xa0]+")chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
title_rule = re.compile("\d+.")
option_rule = re.compile("\([ABCDEF]\)")
option_rule_search = re.compile("\([ABCDEF]\)[^(]+")# 保存最终的结构化数据
question_type2data = OrderedDict()
# 从word文档的“一、单项选择题”开始遍历数据
for paragraph in doc.paragraphs[5:]:#  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格line = black_char.sub("", paragraph.text).replace("(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")# 对于空白行就直接跳过ifnot line:continueif title_rule.match(line):options = title2options.setdefault(line, [])elif option_rule.match(line):options.extend(option_rule_search.findall(line))else:chinese_nums_match = chinese_nums_rule.match(line)if chinese_nums_match:question_type = chinese_nums_match.group(1)title2options = question_type2data.setdefault(question_type, OrderedDict())

遍历结构化字典并存储

然后我们遍历结构化字典,将数据保存到pandas对象中:

import pandas as pdresult = []
max_options_len = 0
for question_type, title2options in question_type2data.items():for title, options in title2options.items():result.append([question_type, title, *options])options_len = len(options)if options_len > max_options_len:max_options_len = options_len
df = pd.DataFrame(result, columns=["题型", "题目"]+[f"选项{i}"for i in range(1, max_options_len+1)])
# 题型可以简化下,去掉选择两个字
df['题型'] = df['题型'].str.replace("选择", "")
df.head()

结果:

最终保存结果:

df.to_excel("result.xlsx", index=False)

完整代码

最终完整代码:

import pandas as pd
import re
from docx import Document
from collections import OrderedDictdoc = Document("编号02 质检员高级技师(一级)理论试卷.docx")black_char = re.compile("[\s\u3000\xa0]+")chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
title_rule = re.compile("\d+.")
option_rule = re.compile("\([ABCDEF]\)")
option_rule_search = re.compile("\([ABCDEF]\)[^(]+")# 保存最终的结构化数据
question_type2data = OrderedDict()
# 从word文档的“一、单项选择题”开始遍历数据
for paragraph in doc.paragraphs[5:]:#  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格line = black_char.sub("", paragraph.text).replace("(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")# 对于空白行就直接跳过ifnot line:continueif title_rule.match(line):options = title2options.setdefault(line, [])elif option_rule.match(line):options.extend(option_rule_search.findall(line))else:chinese_nums_match = chinese_nums_rule.match(line)if chinese_nums_match:question_type = chinese_nums_match.group(1)title2options = question_type2data.setdefault(question_type, OrderedDict())result = []
max_options_len = 0
for question_type, title2options in question_type2data.items():for title, options in title2options.items():result.append([question_type, title, *options])options_len = len(options)if options_len > max_options_len:max_options_len = options_len
df = pd.DataFrame(result, columns=["题型", "题目"]+[f"选项{i}"for i in range(1, max_options_len+1)])
# 题型可以简化下,去掉选择两个字
df['题型'] = df['题型'].str.replace("选择", "")
df.to_excel("result.xlsx", index=False)

最终得到的文件:

如何用Python将Word文档转换为Excel表格相关推荐

  1. 使用python将word文档转换为excel表格

    设计这个脚本需求是需要将一个多标题层级的word文档以及标题下的正文内容,拆解誊写到excel表格中,大致如下: 初始的word文档格式 目的的excel文本格式 实现的代码大致如下,仅供参考,如有疑 ...

  2. Word处理控件Aspose.Words功能演示:在 Python 中将 Word 文档转换为 PNG、JPEG 或 BMP

    MS Word 文件到图像格式的转换让您可以将文档的页面嵌入到您的 Web 或桌面应用程序中.为了在 Python 应用程序中执行此转换,本文介绍了如何使用 Python 将 Word DOCX或DO ...

  3. 如何在微信公众号推文加入Word文档、Excel表格,超实用30秒学会

    大家都知道,当我们订阅了公众号(关注公众号),公众号的运营者就能给我们推送最新发布的公众号文章,我们也能在订阅号栏收到最新的文章.有一些微信公众号推文中会有附件,如word文档.excel表格,比如政 ...

  4. 【教程】微信推文怎么添加附件文档 (如word文档、excel表格、pdf文件)

    对于很多企业单位.中小学校公众号来说,有时在对外发布信息时,需要在公众号文章中插入各种文档附件,如:应聘报名表.健康承诺书.记录统计表.防疫登记表.申报评分.公告通知等,文件类型有:word文档.ex ...

  5. word文档转excel表格

    使用java语言将 word文档转excel表格,首先导入apache的poi依赖 <dependency><groupId>org.apache.poi</groupI ...

  6. 「教程」秀米怎么添加附件(Word文档、Excel表格等)

    [教程]秀米怎么添加附件(Word文档.Excel表格等) 秀米作为一款微信公众号文章编辑器,因为模板众多,操作方便,很受公众号运营者的喜欢.但是很多运营者不知道怎么通过秀米给公众号文章添加附件,秀米 ...

  7. Python读取Word文档段落或者表格

    Python解析word文档 1 .安装并导依赖包 2.word的doc格式转docx格式 3.解析word_doc文档段落.表格内容 4.word读取表格存列表封装优化,节省读取时间 1 .安装并导 ...

  8. Python3-word文档操作(五):利用python修改word文档中的表格数据

    1. 简介: 本篇继续学习python操作word文档的相关知识.本篇主要学习: 1)如何获取一个已经存在文档中的表格的内容: 2)如何修改一个已经存在文档中的表格的内容: 2. 获取word文档中的 ...

  9. python生成word文档的表格_2018-10-04 [日常]用Python读取word文档中的表格并比较

    演示如下. 两个简单的word文档, 各有一个表格: 读取文档中的表格到列表(为演示只对单列表格操作): import docx def 取表格(文件名): 文件 = docx.Document(文件 ...

最新文章

  1. js中给数组中对象去重
  2. WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式---- PeerTrust验证模式...
  3. RHCE课程-RH253Linux服务器架设笔记三-Samba服务器配置(1)
  4. 分区数据导出功能(服务端实现)
  5. 【Leetcode | 11】268. 缺失数字
  6. html文字竖直书写,css 文字竖直居中的写法和图片垂直居中代码(图文)
  7. Flash+XML 加载图片
  8. java中定时JOB的实现方式
  9. python定义变量类型_一、python基础之数据类型与变量
  10. Atitit js nodejs下的进程管理wmic process进程管理
  11. Android Activity防劫持方案
  12. 小白怎么入门网络安全?看这篇就够啦!
  13. 【高效程序员系列】别碰鼠标——让键盘飞起来
  14. 天津理工大学计算机学院绩点,天津理工大学花宇杰:平均绩点4.0你该这般青春昂扬...
  15. 小程序更换云服务器和域名完全攻略
  16. Nodeparty-SZ-1 深圳聚会活动回顾总结[2012.01.08] - CNode
  17. 如何进行文档翻译?文档翻译的软件有哪些?
  18. java图片失真_Java对图片不失真地缩放
  19. 从未停止进化的MaxCompute
  20. macos蓝牙驱动和wifi驱动名称_DW1707(AR9565无线网卡+AR3012蓝牙)

热门文章

  1. Windows部分快捷键命令/命令
  2. python统计英文单词个数_统计英文单词的个数的python代码 及 字符串分割
  3. 写latex 遇到bib中参考文献 的俄文人名(类似于带有声调的拼音字母)如何转义?
  4. 高通机器视觉快速指南二
  5. icloud显示账户详情不可用,苹果icloud账户详情不可用怎么办 iPhone提示当前账户详情不可用怎么回事...
  6. entfrm开发平台,一个免费开源可视化的无代码开发平台
  7. 在单点登录中,如果cookie被禁用了怎么办?
  8. 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
  9. [arm-linux]使用arm驱动hp1020激光打印机
  10. 用计算机撩人套路,撩人套路-撩人套路情话一问一答 - 个性说说吧