有时候,工作中可能会遇到以下场景:将一个含有几十篇文章(约几百至上千页)的word文件拆分为多个文件,每个文件包含一篇文章。
几百上千页的文档,手工处理实在低效,稍微打个盹儿还可能出错。好在我们有python,仅需编写几行代码就可借助python-docx模块拆分word文件,实现自动化办公。
1. 模块安装与概念介绍
python-docx是用于创建和更新Microsoft Word(.docx)文件的Python库。如果你日常需要经常处理Word文档,那么非常推荐使用python-docx,它处理起docx很方便。
python-docx模块已经提交给PyPI仓库,使用下述命令即可安装:
pipinstallpython-docx
在使用python-docx读/写word文档中之前,先介绍本文需要用到python-docx模块的一些概念:
Document对象:表示word文档。
Paragraph对象:表示word文档中的段落。
text属性:表示段落中的文字内容。
style属性:表示段落文本的样式,如:Normal(正常)、Title(标题)等。
2. 读取word文本
以下示例代码读取word文档后,通过paragraph的text和style属性,查看了段落文字内容及段落样式。
#导入模块importdocxdefread_doc(file_input_name)#获取输入文档对象,file_input_name为待读取文档文件doc_obj=docx.Document(file_input_name)#获取文档对象的所有段落并统计段落数lenDoc=len(doc_obj.paragraphs)print(f"总共{lenDoc}个段落")forparagraphindoc_obj.paragraphs:#查看段落样式print(paragraph.style.name)#查看段落文字print(paragraph.text)print("\n")if__name__=='__main__':read_doc("/xxx/xxx/文档拆分示例.docx")
假设处理的文档文件内容如下:
使用示例代码,输出内容如下:
总共71个段落段落样式:Title,段落文本:同质性及其体现段落样式:Normal,段落文本:俗语说“人以类聚,物以群分”,似乎现实生活中也的确如此。关系密切的人常常具有一定的相似性(称为同质性),而这同质性本身则是影响社交网络结构的最基本的概念之一。其中,相似性不仅可能表现在如性别、种族、母语等自然、固有的特征上,也可能体现在在成长和社会交往过程中逐渐形成的兴趣、价值观等可变特征上(一定程度上可由行为体现)。
3. 写入word文本
importdocxdefwrite_doc(paragraphs,file_output_path):#以首段文字(标题)作为文档名result_file_name=os.path.join(file_output_path,paragraphs[0]+".docx")#创建文档对象doc_obj=docx.Document()#添加段落forparagraphinparagraphs:doc_obj.add_paragraph(paragraph)#保存文件doc_obj.save(result_file_name)
示例代码以段落形式将标题与正文写入word文件,也就是说新的word文件里所有段落(无论标题还是正文)的style都为Normal。若想要让标题的style仍然为Title,可使用document.add_heading(paragraphs[0],level = 0)
语句。
4. word文本自动拆分
这里给出了一个完整的示例代码,可以实现对几十篇文章的word文档的自动拆分,每篇文章单独存储。
示例代码拆分word文档思路:通过paragraph的style属性判断是否开始下一篇文章,一旦开始下一篇文章,就将前一篇文章的段落写入一个文件。
写入文件方式有两种:word文件(write_doc)、文本文件(write_txt)。
importos.pathimportdocxFILE_INPUT=r"/xxx/xxx/文档拆分示例.docx"FILE_OUTPUT=r"/xxx/xxx/文档拆分"defwrite_txt(paragraphs,file_output_path,doc_count):"""将篇章内容写入文本文件,以篇章index作为文件名:paramparagraphs::paramfile_output_path::paramdoc_count::return:"""txt_path=os.path.join(file_output_path,"文本文件")ifnotos.path.exists(txt_path):os.makedirs(txt_path)file_output_name=os.path.join(txt_path,str(doc_count)+".txt")paragraphs=map(lambdax:x.strip(),paragraphs)withopen(file_output_name,"w")asfw:fw.writelines("\n".join(paragraphs))defwrite_doc(paragraphs,file_output_path):"""将篇章内容写入word文档,以篇章标题作为文档名:paramparagraphs::paramfile_output_path::return:"""result_file_name=os.path.join(file_output_path,paragraphs[0]+".docx")#创建文档对象doc_obj=docx.Document()#添加段落forparagraphinparagraphs:doc_obj.add_paragraph(paragraph)#保存文件doc_obj.save(result_file_name)defsplit_doc(file_input_name,file_output_path):"""拆分word文档,每个篇章单独保存:paramfile_input_name::paramfile_output_path::return:"""docs_count=0temp_doc=[]#获取输入文档对象doc_obj=docx.Document(file_input_name)lenDoc=len(doc_obj.paragraphs)print(f"总共{lenDoc}个段落")forparagraphindoc_obj.paragraphs:#开始新篇章ifparagraph.style.name.startswith('Title')andlen(temp_doc)!=0:#todo写入文件#todo清空temp_docwrite_doc(temp_doc,file_output_path)docs_count+=1write_txt(temp_doc,file_output_path,docs_count)temp_doc=[]temp_doc.append(paragraph.text)iflen(temp_doc)!=0:write_doc(temp_doc,file_output_path)docs_count+=1write_txt(temp_doc,file_output_path,docs_count)print(f"完成文件拆分,共{docs_count}篇章")if__name__=='__main__':split_doc(FILE_INPUT,FILE_OUTPUT)
5. 总结
本文仅从一个使用场景对python-docx展开了介绍。实际上,python-docx模块还有很多其他用法,比如插入表格、写word时设置字体字号和颜色等。总之,如果日常需要经常处理word文档,那非常推荐python-docx。
往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑AI基础下载机器学习交流qq群955171419,加入微信群请扫码:
如果觉得《【Python】如何用Python实现Word文档拆分》对你有帮助,请点赞、收藏,并留下你的观点哦!