python-docx 将文档根据标题二拆分为多个docx文件

python-docx 将文档根据标题二拆分为多个docx文件

时隔好久,又开始搞文档了
感觉搞来搞去还不如手动复制粘贴得了……

  • 只是文本内容–>简单
  • 文本内容自定义样式保持不变 (有点难度)
  • 提取文档中的图片、表格 (简单)
  • 按照顺序还原图片、表格到文档中,并且不改变样式(累了,毁灭吧)
  • 题注、交叉引用、自动编号……(手动操作一下吧……)

写出来还是蛮有成就感的嘿嘿🤭
其实还有一些细节问题,比如段落的对齐方式、行距、缩进之类的,但是目前就做到这吧~

def split_docx_by_heading(doc_path, output_dir, heading_style='Heading 2'):
    original_doc = Document(doc_path)  # 加载原始文档
    os.makedirs(output_dir, exist_ok=True)  # 创建输出目录(如果不存在)
    namespace = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}  # 获取Word文档中的命名空间
    composer = None
    part_doc = None
    processed_footnotes, footnote_ids = caption_ids_and_texts(original_doc)
    # 遍历文档中的段落和表格
    for element in original_doc.element.body:
        if element.tag.endswith('p'):  # 判断是否为段落
            p = next((p for p in original_doc.paragraphs if p._element is element), None)
            # 检查段落样式是否为指定的标题样式
            if p.style.name == heading_style:
                # 如果当前已有文档片段,则保存该片段
                if composer and part_doc:
                    composer.save(os.path.join(output_dir, f'{file_name}.docx'))
                    print(f"创建文档: {file_name}.docx")
                # 使用标题二的文本作为文件名
                file_name = p.text.strip()
                # 创建新文档,并保持原始文档样式
                part_doc = Document(doc_path)
                composer = Composer(part_doc)
                # 清除文档内容以开始新的章节
                part_doc._body.clear_content()
                # 添加标题二段落到新文档
                part_doc.add_paragraph(p.text, style=p.style)
            elif composer and part_doc:
                if p.style.name=='Heading 1':
                    continue
                else:
                    new_paragraph = part_doc.add_paragraph(p.text, style=p.style)

                # 复制图像和其他图形
                if p._element.findall(".//w:drawing", namespace):
                    new_paragraph.style = p.style.name
                    for run in p.runs:
                        if run._element.findall(".//w:drawing", namespace):
                            new_paragraph._p.append(deepcopy(run._element))

        elif element.tag.endswith('tbl'):  # 判断是否为表格
            if composer and part_doc:
                tbl = element
                tbl_copy = deepcopy(tbl)
                part_doc.add_paragraph().add_run().element.append(tbl_copy)

    # 保存最后一个文档片段
    if composer and part_doc:
        composer.save(os.path.join(output_dir, f'{file_name}.docx'))

# 原文档路径
doc_path = './原始文档.docx'
# 拆分结果输出位置
output_dir = './split_docs/'
# 执行拆分
# 默认按照标题2拆分
# heading_style = 'Heading 2'
split_docx_by_heading(doc_path, output_dir)

奥……导包忘记了……emmmmm就这样吧(●’◡’●)
☞收藏点赞评论加关注!!感谢(●’◡’●)🙇‍🙇‍🙇‍

### 回答1: 可以使用 python-docx 库来操作 docx 格式的文档。这里是一个例子,它可以在 docx 文档中删除所有段落中的 "关键词"。 ```python def delete_keyword(doc_name, keyword): # 载入文档 doc = docx.Document(doc_name) # 遍历每一个段落 for p in doc.paragraphs: # 将段落中的文本拆分成独立的词 words = p.text.split() # 遍历每一个词,如果是 "关键词",就将其删除 for i, w in enumerate(words): if w == keyword: del words[i] # 将处理后的词列表重新连接成一个字符串,并替换原来的段落文本 p.text = ' '.join(words) # 保存文档 doc.save(doc_name) ``` 使用这个函数的方法是这样的: ```python import docx # 调用函数,删除文件 "my_doc.docx" 中的所有 "关键词" delete_keyword("my_doc.docx", "关键词") ``` 希望这能帮到你! ### 回答2: 要实现删除doc格式文件中每一个段落中的所有“关键词”,可以使用python-docx库进行操作。以下是一个示例函数的代码: ```python from docx import Document def delete_keywords_from_doc(file_path, keywords): document = Document(file_path) # 遍历每个段落 for paragraph in document.paragraphs: # 遍历每个关键词 for keyword in keywords: # 删除段落中的关键词 if keyword in paragraph.text: paragraph.text = paragraph.text.replace(keyword, "") # 保存修改后的文件 document.save(file_path) # 使用例子 file_path = "example.docx" keywords = ["关键词1", "关键词2", "关键词3"] delete_keywords_from_doc(file_path, keywords) ``` 在这个示例函数中,我们首先使用`Document`类从文件路径创建一个docx文档对象。然后,我们遍历每个段落,再遍历每个关键词。如果关键词存在于段落文本中,我们使用`replace`函数将其替换为空字符串。最后,我们使用`save`方法保存修改后的文档。 请注意,以上代码仅删除关键词的文本内容,但不会删除关键词所在段落之外的其他文本。如果您需要删除整个段落,可以考虑使用`document.remove(paragraph)`来删除含关键词的段落。 ### 回答3: 您好!根据您的要求,我给出了以下解答: import docx def remove_keywords(file_path): doc = docx.Document(file_path) paragraphs = doc.paragraphs for paragraph in paragraphs: text = paragraph.text updated_text = text.replace("关键词", "") paragraph.text = updated_text doc.save("updated_doc.docx") remove_keywords("original_doc.docx") 以上代码使用了`python-docx`库来处理`.docx`文件。首先,我们打开文件并获取文档中的所有段落。接着,对每一个段落,我们将其文本保存在变量`text`中,并使用`replace()`函数删掉其中的关键词。最后,我们将更新后的文本赋值给段落的`text`属性。最后,我们将修改后的文档保存在名为"updated_doc.docx"的新文件中。 使用该函数时,请将`file_path`参数替换为您要处理的文件的路径。希望这个示例能够帮助到您!如有任何问题,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值