python-docx读不到中文段落通常因路径错误或文档非标,需检查初始化路径是否正确、文档是否由WPS等工具生成;提取纯文本应遍历paragraphs和runs;修改样式前须确认样式名存在;表格图片超链接需手动解析XML。

python-docx 读不到中文段落?检查 Document 初始化路径和编码
python-docx 本身不处理文件编码问题,它直接解析 .docx 的 XML 结构,所以“读不到中文”通常不是编码错误,而是文档本身损坏、或用了非标准生成工具(比如某些国产办公软件导出的伪 .docx)。真正常见的情况是:Document 初始化时传入了错误路径(比如路径含中文但未用 raw string 或未正确转义),导致抛出 PackageNotFoundError 或静默跳过。
- 确保路径用正斜杠或双反斜杠,例如:
r"C:\test\demo.docx"或"C:/test/demo.docx" - 不要用
open()先读文件再传给Document()——Document()只接受路径字符串或 file-like object(且必须支持seek(0)) - 如果文档由 WPS 或在线转换器生成,先用 Microsoft Word 打开另存为一次,再用 python-docx 读取
怎么提取所有纯文本(不含表格、脚注、文本框)?用 paragraphs + runs 组合遍历
很多人以为 paragraph.text 就是完整段落内容,其实它会丢掉加粗/颜色等格式信息,但更关键的是:它**不包含表格内的文字、页眉页脚、文本框、批注**。如果你只要主文档流里的连续文本,就得老老实实遍历 document.paragraphs,并逐个拼接 run.text(因为一个段落可能有多个 run,对应不同样式)。
-
paragraph.text是快捷方式,等价于"".join(run.text for run in paragraph.runs),可用但不够可控 - 若需保留换行逻辑,注意
paragraph之间天然有段落分隔,但run内无换行符 —— Word 的换行(Shift+Enter)在run中表现为\n,而段落结束才是\n\n - 跳过空段落:
if paragraph.text.strip(),避免一堆空白行
修改段落样式失败?别直接赋值 paragraph.style,先确认样式名存在
python-docx 对样式的操作是“名称匹配”,不是对象引用。你写 paragraph.style = "Heading 2",它会去文档的样式库中找名为 "Heading 2" 的样式。如果该样式没被文档显式使用过(哪怕 Word 界面里看着有),document.styles 里就查不到,会报 KeyError 或静默失败。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 先打印所有可用样式名:
[s.name for s in document.styles],注意大小写和空格(比如可能是"heading 2"或"标题 2") - 安全写法是用
document.styles["Heading 2"]获取样式对象后再赋值,而不是字符串直赋 - 自定义样式要先用 Word 在文档里应用一次,或用
document.styles.add_style()注册(但仅限新建文档)
表格、图片、超链接内容怎么读?python-docx 原生支持有限
表格能读(document.tables),但单元格内嵌段落要手动进一层;图片只存路径或二进制 blob(table.cell(0,0).paragraphs[0].runs[0].part.related_parts),没有自动 OCR 或尺寸解析;超链接是 hyperlink 对象,但 URL 存在 XML 属性里,得从 run._element 往下挖。
- 表格文本:循环
table.rows→row.cells→cell.paragraphs→p.text,别漏掉合并单元格的逻辑 - 图片:实际是
InlineShape,需访问run._element.xpath(".//a:blip")提取 rId,再查document.part.related_parts,过程繁琐且易断 - 简单需求建议绕过 —— 用
docx2python库替代,它把表格展平成嵌套 list,图片路径直接可读,但会丢失样式细节
真正麻烦的从来不是“怎么读”,而是 Word 文档本身结构混乱:同一个视觉效果,XML 实现方式可能有十几种变体。别指望一套代码通吃所有 .docx,每次遇到新文档,先用 opc-diag 或解压 .docx 查看 word/document.xml,比瞎调参数快得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










