You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python替换docx文件文本时如何保留原有格式?

格式丢失原因

python-docx 中,段落的所有格式(粗体、斜体、字号等)都是绑定在段落内的run对象上的,你直接对paragraph.text整体赋值,会清空该段落下所有原有run,生成一个无格式的新run,自然就丢失了原来的粗体样式。

修复方案

遍历段落内的每一个run,单独对每个run的文本做替换,替换过程中run本身的格式属性会完整保留,原有样式不会丢失。如果你的文档包含表格,也需要单独遍历表格内的文本做同样处理,避免漏替换。

修正后代码
# -*- coding: utf-8 -*-
import docx
import os

def replace_docx_text(from_filename, to_filename, old_value, new_value):
    doc = docx.Document(from_filename)
    # 处理正文段落
    for paragraph in doc.paragraphs:
        for run in paragraph.runs:
            run.text = run.text.replace(old_value, new_value)
    # 处理表格中的内容,不需要可以删除这部分
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                for paragraph in cell.paragraphs:
                    for run in paragraph.runs:
                        run.text = run.text.replace(old_value, new_value)
    doc.save(to_filename)

if __name__ == '__main__':
    new_filename = 'result_from_python.docx'
    # 增加存在性判断,避免首次运行无目标文件时报错
    if os.path.exists(new_filename):
        os.remove(new_filename)
    replace_docx_text('USA.docx', new_filename, 'а', 'о')
补充说明

如果待替换的字符串刚好跨越了两个相邻的run(比如你好两个字,你是第一个run,好是第二个run,要替换你好这个整体),上述方法会替换失败。这类特殊场景需要先对相邻run的文本做合并判断再处理,普通日常使用场景下,上述代码完全可以满足需求。


内容的提问来源于stack exchange,提问作者Василий Никпуп

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:06:07