作者:青春阳光king

python实现word转成自定义格式的excel文档(解决思路和代码)支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符。

最近在开发一个答题类的小程序,到了录入试题进行测试的时候了,发现一个问题,试题都是word文档格式的,每份有100题左右,拿到的第一份试题,光是段落数目就有800个。而且可能有几十份这样的试题。

而word文档是没有固定格式的,想批量录入关系型数据库mysql,必须先转成excel文档。这个如果是手动一个个粘贴到excel表格,那就头大了。

我最终需要的excel文档结构是这样的:每道题独立占1行,每1列是这道题的一项内容,大概就是问题、选项A、选项B等等。

但word文档是这种结构,如果按照网上通用的方式去转,基本上你得到的结果就是一大坨文字都在一格里,根本不符合需求。

最后我想到了一个解决思路,可以实现这个需求,先看看我转出来的结果:

点击播放 GIF 0.9M

这个格式虽然跟最终的有点差别,但是只要在excel文档或者在代码里稍微再修改一下,就能完全符合要求了。

废话少说,先贴出代码,看得懂的可以直接拿去用,看不懂的,可以看我后面的具体说明。

已经把它封装成通用脚本了,你可以直接调用。

一、先说一下实现这个需求的处理逻辑

解决这个需求的关键点是什么:

1、python怎么读取这个文件的内容?

python有相关的word操作库可以读取,但是读取到的结果不方便操作。我们最终是要让它生成excel文件的,所以可以用python非常强大的科学计算包pandas来读取操作数据更好。

但pandas不能直接读取word文件,所以,需要先把它转成txt文档,这一步很简单,打开word,全部复制到一份新的txt文件中就行了。(注意要在第一行给它加上列名,我直接加了个colomn1,代表是第一列)

简单处理后的txt文档的结构类似这样:

2、读取到的数据如何处理?

使用pandas读取到的数据是一个dataFrame,dataFrame的结构就类似于我们在excel文档里面那样行列分明的。但是,它从txt读取出来的格式是全部内容都视为1列的,而txt中的每一段,在它这里就是每一行(注意是每一段对应一行,而不是每一行对应每一行)

预览一下:结果显示800行,1列。也就是在txt文档中有800个段落。

3、接下来怎么处理呢?

pandas强大的地方就在这里了,它可以直接把这1列的内容全部转成Series,Series是什么你可以不用管,你只需要知道Series可以直接转成列表list就行了。有了list我们就方便操作了。

以上几步就实现了从word里面读取数据,并转化成python的数据类型list了。list里面的每个元素,就等同于我们word里面的每一个段落。

控制台打印出来的就是这样:

下面的800是计算出这个列表的长度,代表有800个元素。

接下来我们的需求就变成了:怎么把一个列表,转成有明确行列结构的excel表格了。

这个要分为2种情况来说:

1、你的word文档结构相对合理些,每道题都固定是X个段落(例如每道题都是8个段落),这个解决就很简单了。因为这种情况对应就是在list中,每8个元素构成了1道题,你只要按照规律,8个8个取出,最后批量写入excel就行了。(这种解决起来比较简单,就不详细说了)

2、另一种情况比较麻烦,就是word文档的结构不规范,有的题目可能是8个段落,有的可能是7段,有的是6段。那么要怎么解决呢?

解决这个问题有几个关键点:

1、excel表格是行列结构的,它每一行的数据来源于这个txt文档的第几行?(也就是list里面的第几个元素)

所以我们只要把每道题在list中的索引找出来就行了。

观察一下源数据,它每道题的开头都是数字加1个英文符号“.”,例如:“1.”和“2.”,最大的是"100.",并且其他段落的开头都不会出现这个结构。那么就简单了,我先构造出一个patch_list=[‘1’, ‘2’, ‘3’…‘100’],用来做匹配。

然后再遍历源数据列表,对列表的每个元素按“.”号切割,切割后拿到它的第一个元素,拿这个元素跟pacth_lis进行匹配,如果它是在patch_list中的,就代表它是每道题的开头。此时就记录下它的索引,并且把这个索引值存放到一个新列表index_list中。

下面是我获取到的index_list:

0代表了第一道题是在列表的第1个元素开始的,8代表第二道题在列表的第9个元素开始。

于是我们就知道每道题的开头是在列表中的哪个位置了。

2、拿到了每道题的索引,然后怎么做呢?

最终我们是要转存到excel文档中的, pandas怎么转excel?

很简单的,只要你构造出一个dataFrame出来,调用pandas的to_excel方法,就能存入excel文档了。

3、问题的关键就变成了,有了每道题的索引,怎么把它转成dataFrame结构。

下面演示一下,假如你想要构造一个dataFrame,需要什么样的数据结构,构造出来的dataFrame在控制台的输出结果是怎么样的,最后生成的excel表格是怎么样的。

这个就是调用pandas的DataFrame方法,用字典dict生成的一个dataFrame数据。

这个dataFrame在控制台打印出来就是:

这个结构存入excel就是对应表格的行和列了。这个结构就符合我的实际需求了。

所以我们要构造出这个dataframe的关键就是:把所有数据梳理一遍,构造成类似这样的一个字典。

那么怎么构建这个dict呢?

我们源数据转出来的list结构是类似这样的:

list = [‘问题1’,“A:问题1的A选项”, ‘B:问题1的B选项’…‘问题2’,“A:问题2的A选项”, ‘B:问题2的B选项’]

而我们前面得到的index_list=[0, 8, 16。。。。]

它记录了“问题1”,“问题2”等等直到“问题100”是在哪个位置开始的,所以我们只需要把index_list遍历一下,轮流取出它的每个元素,它就是每道题的开始位置,然后拿到紧跟在这个元素的下一个是什么,用这个减去1就知道了每道题的开始位置start和结尾位置end是多少了。接着使用

就可以轮番从list中取出每道题的各项内容,取到的第一个就加到dict的colomn1列表中,第二个就加到dict的colomn2中,按照这个规律,就能把list的内容分开插入到dict中的各个列表中了。

但在这个过程中,可能你每道题的段落数目不一致,也就是你按照这个规律从list中取出的元素,可能每次取出的数量都不一样。这点需要注意,如果没有对它进行处理,最后会导致转出来的文件内容错位了,例如你的文档里面,第一题有8个段落,第二题只有7个,第三题有8个段落,没处理这个问题的话,最后第三题的第8个段落,就会跑到第7题那边了。并且最终dataFrame会无法生成excel文件。

那么这个问题怎么解决呢?

在正式调用处理函数生成excel文件之前,可以先对文件预处理,拿到它们的数据进行判断,如果判断到它每个间隔不一样,有的缺少段落,那么就让数据预处理函数返回一个值为False,间隔一样就返回True。接着在真正的数据提取环节,根据这个进行判断,如果判断到它值是Fales,那么就在每一轮遍历提取数据的最后一次遍历,一次性在它后面的缺失数据的列加上空字符串,作为占位用,这样最后得到的列表长度就都一样了,并且在最后生成的excel表中,它是一个空格。

最后用dict生成dataFrame,再写入excel文档,我们就大功告成了。

二、再说一下具体怎么使用:

运行必须的工具

1、python解释器(pycharm或其他);

2、python自带模块:os;

3、自行安装模块:pandas,openpyxl;

自行安装的模块,在控制台pip install pandas和pip install openpyxl就行了。

怎么调用

1、先要做数据预处理:先要把word文档的内容复制到txt文档中,并且在第一行加上"column1",处理后像下面这样:

接着要看你的文档内容是否有题号,如果有的话:比如像我这个,有具体的题号1-100题,并且它的写法都是“1.”,在题号后面跟了个英文字符“.”,顺序递增到100。

那么你就可以调用file_handle_by_range。你给它传第一个参数是个具体的文件路径,它就会去打开这个文件,读取里面的内容。

传的第二个参数是100,它就会自动生成1到100的字符串,用来匹配识别你的每道题的开头在哪个位置。(如果你最大的题号是200,就写200,可以写多,但不能写少,少了识别到的内容会缺失)

传的第三个参数是“.”,它就会按照“.”去切割每一行的内容,拿到第一个“.”号前面的内容,用来跟它生成的匹配字符做比对,比对成功了,它就默认该行是你想要写到excel表格里的第一列,接在它后面的每个段落,会自动插入到它后面的列。

直到匹配到下一个“数字.”开头的,又重复这个过程。

如果你的文档里面并不是像我这样,没有顺序递增的题号,你可以手动给每个你想要放在表格中第一列的段落,在它前面加标识符,例如“####.”,注意最后是有个小点的。像下面这样:

接着调用

那么它就默认按照“.”去切割每行内容,并且按照####来匹配识别切到的内容,如果切到在“.”前面的是“####”,那么它就默认这一段是你想存到excel表第一列的段落,在它后面的几段,都会按照每个段落存入一格去处理。直到下一个“####.”出现。

2、可调用的有4个函数:

2.1、假如你只想处理一个具体的文档,并且它有具体的题号,最大题号是100,并且它后面跟的是一个“.”,那么就按照下面这个调用

2.2、根据自定义匹配符处理具体文件,参数传文件路径,匹配符可以自定义,切割符也可以自定义

2.3、根据数字处理具体整个文件夹,参数传文件路径,可迭代的最大数可自定义,分隔符也自定义。(注意文件夹路径,最后是不跟文件名的,它是个文件夹,不是具体文件路径)

2.4、根据自定义匹配符处理具体文件夹,参数传文件路径,匹配符可以自定义,切割符也可以自定义

分享或在看是对我最大的支持

python自动化之文件处理_Python自动化办公之Word批量转成自定义格式的Excel相关推荐

  1. python实现word文档批量转成自定义格式的excel文档

    python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试 ...

  2. python发送微信文件夹_python自动化操作——复制文件到剪切板发送微信

    from pyqt5 import qtcore,qtwidgets import win32gui, win32api, win32con # 调用win32api的模拟点击功能实现ctrl+v粘贴 ...

  3. Python将png格式批量转成jpg格式,并批量用圆抠图

    Python将png格式批量转成jpg格式,并批量用圆抠图 png与jpg图片格式互转 批量用圆抠取图片 png与jpg图片格式互转 Python在做批量抠取图片时,遇到png格式的图片读取不出三通道 ...

  4. 多个dwg文件批量转换成jpg格式

    为了在设计绘图工作中更好地传输查看,我们需要把大量的dwg文件转换成jpg格式.那么有什么快捷的方法呢?今天就为大家推荐一款软件-CAD编辑器,来批量操作将多个dwg文件批量转换成jpg格式.具体步骤 ...

  5. excel中html批量转化为pdf文件,excel怎么批量转换成pdf格式

    时间:2020-02-10来源:百度经验作者:名字是代称阅读:5 Excel一直以来都是作为表格存入数据作用的,同时编辑数据也非常方便.但是若只用来阅读,却并不方便.而pdf格式很方便阅读,所以有人就 ...

  6. Word怎么转换成PDF格式的文件

    Word怎么转换成PDF格式的文件?现在很多办公室都会接触到类似的问题,对于普通员工来说,领导说什么就是什么,领导让怎么做就得怎么做.小编每天都是各种资料和报告,领导前几日有发了不少Word文件让我想 ...

  7. 如何将CAD文件批量转成PDF格式?转换软件快捷处理

    在现代工作中,CAD软件广泛应用于各行各业,是重要的设计和工程工具.而在日常工作中,将CAD文件批量转换为PDF格式是一个很常见的需求.PDF格式可以更好地适应文档共享.传输和打印的需要,因此在实际工 ...

  8. 如何将PDF文件批量转换成图片格式

    在我们的日常工作中文件转换是一件常见的日常工作,而PDF文件转换是每一个上班族必备的技能之一,比如讲PDF文件转换成图片格式.毫无疑问PDF格式给用户带来更好的阅读体验,PDF文件是一页一页的文件形式 ...

  9. Java向将指定文件(含文件列表)或者指定路径下目录打包成zip格式

    Java向将指定文件(含文件列表)或者指定路径下目录打包成zip格式 运行环境 pom依赖 测试方法 测试效果 运行环境 1.springboot 2.2.x 2.maven 3.5.4 pom依赖 ...

最新文章

  1. mysql插入大量数据
  2. 交换环境下的冗余及负载分担技术(STP Channel HSRP)
  3. Remoting系列专题---自定义序列化类
  4. js 简单的数组去重13种方法
  5. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
  6. 管理数据库计算机网络,计算机网络与数据库管理系统.pdf
  7. 港府多措施推广使用电动车 放宽条件吸引车主换车
  8. 【MySQL入门】(一)安装与配置MySQL
  9. Knockoutjs开发指南
  10. 用python的tkinter做游戏(九)—— 坦克大战 正式篇
  11. 朋友公司年会需要一个抽奖程序,我花1小时给她写了一个...
  12. 基于android校园新闻APP开发的设计与实现
  13. Burpsuite配置抓apk流量代理设置脚本
  14. Excel 如何让一列中的很多数 同时加上一个数
  15. 【故障处理】队列等待之enq: TX - row lock contention
  16. SiamFC:Fully-Convolutional Siamese Networks for Object Tracking
  17. 淘宝/天猫获得淘宝商品详情高级版 API 返回值说明
  18. selenium抓取斗鱼直播平台数据
  19. 业务员与客户沟通的礼仪
  20. 微信小程序汽车租赁平台+后台管理系统

热门文章

  1. 【软件工程】RUP与软件开发5大模型
  2. snagit屏幕截图转pdf
  3. TVM编译机器学习到 WASM 和 WebGPU
  4. 激光雷达和毫米波雷达
  5. 客快物流大数据项目(十七):自定义镜像mycentos
  6. Python 2x 中list 里面的中文打印效果乱码
  7. layer弹窗在IOS上,被软键盘挤到上边的解决方法
  8. Python——Entry、Text控件
  9. 2022-2028年中国三网融合产业深度调研及投资前景预测报告
  10. Nexus2.x安装