【Python】如何用Python实现Word文档拆分

有时候,工作中可能会遇到以下场景:将一个含有几十篇文章(约几百至上千页)的word文件拆分为多个文件,每个文件包含一篇文章。

几百上千页的文档,手工处理实在低效,稍微打个盹儿还可能出错。好在我们有python,仅需编写几行代码就可借助python-docx模块拆分word文件,实现自动化办公

1. 模块安装与概念介绍

python-docx是用于创建和更新Microsoft Word(.docx)文件的Python库。如果你日常需要经常处理Word文档,那么非常推荐使用python-docx,它处理起docx很方便。

python-docx模块已经提交给PyPI仓库,使用下述命令即可安装:

pip install python-docx

159bef4566a1d6f6e5f642484c91d3d8.png

在使用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")

假设处理的文档文件内容如下:

8ba74745d020523122e79a048500e0b3.png

使用示例代码,输出内容如下:

总共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,加入微信群请扫码:

3d7f2279400b797e41fb61972c84195e.png

Python中,可以使用Python-docx库来处理Word文档。要拆分某范围的Word文档,可以按照以下步骤进行: 1. 首先,安装Python-docx库。可以使用pip命令来安装该库:pip install python-docx 2. 导入所需的库和模块。在Python脚本的顶部,使用import语句导入python-docx库和其他所需的模块。 3. 使用docx.Document类打开要拆分Word文档。通过指定文件路径,使用Document类的open方法打开Word文档,并将其保存为一个变量。 4. 设置拆分范围。根据需要,可以设置要拆分的范围,例如要拆分的页面范围或特定段落的范围。 5. 创建新的文件并将相应内容复制到新文件中。使用Document类的add_paragraph方法添加段落到新文件中,或者使用add_table方法添加表格到新文件中。 6. 最后,保存新的文件。使用Document类的save方法保存新的文件。指定新文件的路径和名称。 以下是一个简单的示例代码,用于拆分Word文档的某个范围: ```python import docx # 打开文档 doc = docx.Document("input.docx") # 拆分范围 start_page = 2 end_page = 5 # 创建新文件 new_doc = docx.Document() # 复制内容到新文件 for page_num in range(start_page - 1, end_page): for element in doc.pages[page_num].elements: if isinstance(element, docx.table.Table): new_doc.add_table(element) elif isinstance(element, docx.text.paragraph.Paragraph): new_doc.add_paragraph(element.text) # 保存新文件 new_doc.save("output.docx") ``` 以上代码假设要拆分的文档为"input.docx",并将拆分的范围设置为第2页到第5页。结果将保存为"output.docx"。你可以根据需要修改范围和文件路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值