python-docx默认只处理段落,表格、页眉页脚、文本框需显式遍历;直接改para.text会丢失格式,须逐run操作保留bold等属性;遇XML错误应另存标准.docx并接受修订。

用 python-docx 替换正文文字时,为什么改不了表格和页眉里的内容?
python-docx 默认只处理 document.paragraphs,而表格单元格、页眉页脚、文本框里的文字属于独立结构,必须显式遍历。漏掉这些地方是批量替换失败最常见原因。
实操建议:
立即学习“Python免费学习笔记(深入)”;
需要创建、读取、编辑或处理 Word 文档(.docx / .dotx)时使用。触发词:'Word'、'word 文档'、'.docx'、'生成报告'、'制作合同/简历/方案/说明书'、'提取 word 内容'、'在文档里查找替换'、'给文档加页眉页脚/目录/表格'。也用于把任意内容排版成一份正式的 Word 文件。不要用它处理 PDF、Excel 或无关编程任务。中文创作场景尤其适合:小说大纲稿、投稿文档、合同、简历、工作总结。
- 先用
for para in doc.paragraphs:处理所有段落 - 再遍历每个表格:
for table in doc.tables:→for row in table.rows:→for cell in row.cells:→for para in cell.paragraphs: - 页眉页脚要分节处理:
for section in doc.sections:→section.header.paragraphs和section.footer.paragraphs - 注意:页眉/页脚可能为空(
None),需加if section.header:判断
替换时保留原文本格式(加粗、颜色、字号)怎么做?
直接改 para.text 会清空所有格式;必须逐个 run 处理,否则字体、高亮、下划线全丢。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 不要用
para.text = para.text.replace(...) - 对每个段落,用
for run in para.runs:遍历,检查run.text是否含目标字符串 - 匹配到后,用
run.text = run.text.replace(old, new)—— 这样格式属性(run.bold、run.font.color.rgb等)自动保留 - 若需跨 run 匹配(如“hello”被拆在两个 run 里),python-docx 不支持,得先合并 run 或换用其他库(如 docx2python)
遇到“KeyError: ‘w:br’”或“InvalidXmlError”报错怎么办?
这类错误多发生在文档含复杂格式(修订模式、域代码、OLE对象)或由 WPS/苹果 Pages 导出的 .docx 文件中。python-docx 对非标准 XML 兼容性较弱。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用 Word 打开源文件 → 另存为「Word 文档(*.docx)」→ 关闭「保存时优化兼容性」以外的所有选项
- 避免处理开启「修订」的文档;替换前先接受所有修订:
doc.accept_revisions()(需 python-docx ≥ 0.8.11) - 若仍报错,在
try...except KeyError:中跳过异常 paragraph/table,加日志记录位置(如print(f"跳过第{idx}段落")) - 真有域代码(如
{ PAGE })需要替换,得用doc._element.xpath()直接操作底层 XML,风险高,不推荐初学者尝试
批量处理上百个 .docx 文件,怎么避免内存爆掉或速度慢?
python-docx 加载大文档时内存占用高,且每次 Document() 都解析整个 XML。不释放对象或重复打开会迅速拖垮性能。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
with open(path, 'rb') as f:读取二进制流,传给Document(f),避免临时文件 - 处理完一个文件立即删掉 doc 对象:
del doc,再调用gc.collect()(尤其 Windows 下) - 别用
glob('**/*.docx')一次性加载全部路径;改用os.walk()+ 逐个处理 - 若只需纯文本替换(不关心格式),可改用
docx2python库——它不加载样式,速度快 3–5 倍,但无法保留加粗/颜色

















