有时候,工作中可能会遇到以下场景:将一个含有几十篇文章(约几百至上千页)的word文件拆分为多个文件,每个文件包含一篇文章。
几百上千页的文档,手工处理实在低效,稍微打个盹儿还可能出错。好在我们有python,仅需编写几行代码就可借助python-docx模块拆分word文件,实现自动化办公。
1. 模块安装与概念介绍
python-docx是用于创建和更新Microsoft Word(.docx)文件的Python库。如果你日常需要经常处理Word文档,那么非常推荐使用python-docx,它处理起docx很方便。
python-docx模块已经提交给PyPI仓库,使用下述命令即可安装:
pip install python-docx
在使用python-docx读/写word文档中之前,先介绍本文需要用到python-docx模块的一些概念:
Document对象:表示word文档。
Paragraph对象:表示word文档中的段落。
text属性:表示段落中的文字内容。
style属性:表示段落文本的样式,如:Normal(正常)、Title(标题)等。
2. 读取word文本
以下示例代码读取word文档后,通过paragraph的text和style属性,查看了段落文字内容及段落样式。
# 导入模块
import docx
def read_doc(file_input_name)
# 获取输入文档对象,file_input_name为待读取文档文件
doc_obj = docx.Document(file_input_name)
# 获取文档对象的所有段落并统计段落数
lenDoc = len(doc_obj.paragraphs)
print(f"总共{lenDoc}个段落" )
for paragraph in doc_obj.paragraphs:
# 查看段落样式
print(paragraph.style.name)
# 查看段落文字
print(paragraph.text)
print("\n")
if __name__ == '__main__':
read_doc("/xxx/xxx/文档拆分示例.docx")
假设处理的文档文件内容如下:
使用示例代码,输出内容如下:
总共71个段落
段落样式:Title,段落文本:同质性及其体现
段落样式:Normal,段落文本:俗语说“人以类聚,物以群分”,似乎现实生活中也的确如此。关系密切的人常常具有一定的相似性(称为同质性),而这同质性本身则是影响社交网络结构的最基本的概念之一。其中,相似性不仅可能表现在如性别、种族、母语等自然、固有的特征上,也可能体现在在成长和社会交往过程中逐渐形成的兴趣、价值观等可变特征上(一定程度上可由行为体现)。
3. 写入word文本
import docx
def write_doc(paragraphs, file_output_path):
# 以首段文字(标题)作为文档名
result_file_name = os.path.join(file_output_path, paragraphs[0] + ".docx")
# 创建文档对象
doc_obj = docx.Document()
# 添加段落
for paragraph in paragraphs:
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)。
import os.path
import docx
FILE_INPUT = r"/xxx/xxx/文档拆分示例.docx"
FILE_OUTPUT = r"/xxx/xxx/文档拆分"
def write_txt(paragraphs, file_output_path, doc_count):
"""
将篇章内容写入文本文件,以篇章index作为文件名
:param paragraphs:
:param file_output_path:
:param doc_count:
:return:
"""
txt_path = os.path.join(file_output_path,"文本文件")
if not os.path.exists(txt_path):
os.makedirs(txt_path)
file_output_name = os.path.join(txt_path,str(doc_count)+".txt")
paragraphs = map(lambda x:x.strip(),paragraphs)
with open(file_output_name,"w") as fw:
fw.writelines("\n".join(paragraphs))
def write_doc(paragraphs, file_output_path):
"""
将篇章内容写入word文档,以篇章标题作为文档名
:param paragraphs:
:param file_output_path:
:return:
"""
result_file_name = os.path.join(file_output_path, paragraphs[0] + ".docx")
# 创建文档对象
doc_obj = docx.Document()
# 添加段落
for paragraph in paragraphs:
doc_obj.add_paragraph(paragraph)
# 保存文件
doc_obj.save(result_file_name)
def split_doc(file_input_name, file_output_path):
"""
拆分word文档,每个篇章单独保存
:param file_input_name:
:param file_output_path:
:return:
"""
docs_count = 0
temp_doc = []
# 获取输入文档对象
doc_obj = docx.Document(file_input_name)
lenDoc = len(doc_obj.paragraphs)
print(f"总共{lenDoc}个段落" )
for paragraph in doc_obj.paragraphs:
# 开始新篇章
if paragraph.style.name.startswith('Title') and len(temp_doc)!=0:
# todo 写入文件
# todo 清空temp_doc
write_doc(temp_doc, file_output_path)
docs_count +=1
write_txt(temp_doc, file_output_path, docs_count)
temp_doc = []
temp_doc.append(paragraph.text)
if len(temp_doc)!=0:
write_doc(temp_doc, file_output_path)
docs_count +=1
write_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,加入微信群请扫码: