社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】实战多word的内容合并筛选及输出

机器学习初学者 • 3 年前 • 254 次点击  
导语


领导给了一个任务:已知每天公司会发一个“每日要情”doc文件,求一年每日要情中所有数字化转型相关内容的汇编。


开发工具


python版本:3.8.8

相关模块:

os

docx

win32com


环境搭建


安装Python并添加到环境变量,pip安装需要的相关模块即可。


代码全解


解这种办公自动化的题,最简单易懂的思路就是用python全程模拟人的全套动作。那么人肉暴力解这道题是怎么解?首先要人肉将所有word文档粘贴在一起,再Ctrl+F查找数字化转型相关的关键词,把搜到的内容整理到另外一个word里。目测两天两夜弄不完,即使弄得完,也会被机械劳动恶心死。


那么整个项目就被分解为三大动作:合并word,检索word,输出word。


1. 合并word

虽然处理word和excel有很多库,比如处理excel的xlrd、xlwt、xlutils、xlwings、openpyxl、xlsxwriter,处理word的python-docx、docx2txt、textract、antiword。


但是他们都不如win32com这个神器好用。它能支持office所有的com接口。这个接口的使用说明在微软的官网也可以查询到。有了这么完备的接口,我们就能在office的功能中“为所欲为”。其他的库,更加轻量,但是如果要用到更复杂的功能的时候,可能就比较捉襟见肘。


更要命的是没有支持doc文件的库,大部分只支持docx文件。


那么如何用win32com合并doc文件并生成docx文件,就成了本项目最关键的一步。


import osimport win32com.client as win32
word = win32.gencache.EnsureDispatch('Word.Application')
#启动word对象应用word.Visible = False
#获取文件夹中的所有doc文件的文件名path = r'D:\pythonProject\meiriyaoqing\2021年每日要情'files = []for filename in os.listdir(path): filename = os.path.join(path,filename) files.append(filename)
#新建合并后的文档output = word.Documents.Add()
#拼接文档for file in files: output.Application.Selection.InsertFile(file)
#获取合并后文档的内容doc = output.Range(output.Content.Start, output.Content.End)
#保存docx文档output.SaveAs('D://pythonProject//meiriyaoqing//result.docx')output.Close()


差不多等个10多分钟,800多页,88万字的报告就合并完成了。



所有doc内容被合并到了result.docx里。



2. 检索word


首先读取result.docx的内容看看一共有多少个段落。


import docxfrom docx import Document
doc = Document("result.docx")print("段落数:"+str(len(doc.paragraphs)))print(len(doc.paragraphs))



把所有段落存放在一个名为text的列表中。


#段落内容存入列表text=[]for i in range(len(doc.paragraphs)):    text.append(doc.paragraphs[i].text)    print("第"+str(i)+"段的内容是:"+doc.paragraphs[i].text)print(text)


按内容来划分这些段落,将有数字化转型及其相关词的段落全部取出,放在第一部分。


#按内容分类
result=docx.Document()
paragraph1 = result.add_paragraph("\n数字化转型相关内容:\n")
for i in text: flag=0 if '数字化转型' in i: print(i) result.add_paragraph(i, style='List Number') flag=1 if '5G' in i: if flag ==0: result.add_paragraph(i, style='List Number') flag=1 if 'RPA' in i: if flag ==0: result.add_paragraph(i, style='List Number') flag=1 if '人工智能' in i: if flag ==0: result.add_paragraph(i, style='List Number') flag=1


按专业来划分这些段落,将有信通专业及其相关词的段落全部取出,排除掉其中包含有信通公司但是属于现场作业类的段落,放在第二部分。


#按专业分类:
paragraph2 = result.add_paragraph("\n信通公司相关内容:\n")
for i in text:
if '现场作业' in i: continue
if '信通公司' in i: print(i) result.add_paragraph(i, style='List Number') if '信通分公司' in i: print(i) result.add_paragraph(i, style='List Number') if '信息通信分公司' in i: print(i) result.add_paragraph(i, style='List Number')


3. 输出word

result.save("每日要情智能分类结果.docx")





    
往期精彩回顾




站qq群955171419,加入微信群请扫码:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124892
 
254 次点击