用 Python 解析 Word 文档时怎么配置环境和处理常见格式
先确认你的 Word 文件到底是哪种格式
Word 解析配置的第一步不是装库,而是分清文件格式。.docx 是 Office 2007 之后基于 XML 的压缩包格式,.doc 是更早的二进制格式。
两者差异很大,python-docx 只能读 .docx,读 .doc 会直接报错。
判断方法很简单,在文件所在目录执行:
file 报告.docx
file 旧文档.doc
输出含 Microsoft Word 2007+ 或 Zip archive 的是 .docx;
输出 Composite Document File 的是老式 .doc。
后者要先转换,Linux 上可用 LibreOffice:
libreoffice --headless --convert-to docx 旧文档.doc
转换后再走后面的解析流程。
这一步没做对,后面的报错基本都是白费功夫。
安装解析库并跑通最小示例
主流程用 python-docx,它更适合按结构取段落和表格。
建议在虚拟环境里装,避免污染系统 Python:
python3 -m venv wordenv
source wordenv/bin/activate
pip install python-docx
最小验证脚本如下,先确认能打开文件再谈批量处理:
from docx import Document
doc = Document("报告.docx")
print("段落数:", len(doc.paragraphs))
print("表格数:", len(doc.tables))
for p in doc.paragraphs[:5]:
if p.text.strip():
print(repr(p.text))
预期结果是打印出段落总数、表格总数和前几段文本。
如果这里就报 PackageNotFoundError,说明文件不是合法 .docx 或路径写错,回到第一步检查格式。
按结构取内容而不是只取纯文本
doc.paragraphs 只覆盖正文段落,页眉、页脚、表格里的文字不会被它包含。
如果只是做全文检索,可以用 docx2txt 这类库一把梭:
import docx2txt
text = docx2txt.process("报告.docx")
但如果要保留结构,就分别处理。
表格按行列读取:
for table in doc.tables:
for row in table.rows:
cells = [c.text.strip() for c in row.cells]
print("\t".join(cells))
页眉页脚要遍历每个 section:
doc = Document("报告.docx")
for section in doc.sections:
for p in section.header.paragraphs:
print("页眉:", p.text)
需要注意,合并单元格在 row.cells 里会重复出现同一段文字,做统计时要按单元格对象去重,否则行数、字数会偏大。
容易踩的几个坑
- 空段落大量出现:Word 里回车产生的空段落也会被计入
paragraphs,统计前用if p.text.strip()过滤。 - 中文乱码:python-docx 读的是 XML 文本,正常不会乱码;出现乱码多半是文件被加密或损坏,先用 Word 或 LibreOffice 打开另存一次。
- 文档被占用:Windows 下文件正被 Word 打开时读取可能失败,批量脚本前先确保文件已关闭。
- 老式
.doc直接报错:这不是库的 bug,是格式不支持,按第一节先转换。
用可核对的数字确认解析成功
解析完不要只看“没报错”。
建议做一次交叉验证:用 Word 或 LibreOffice 打开原文件,核对段落数、表格数是否和脚本输出一致;
再抽一段含中文、英文、数字的文本,确认提取结果与原文逐字相同。
批量处理时,把每个文件的段落数、表格数、字符数写进日志,出现异常文件能快速定位。
如果后续要把解析结果接入检索或知识库,可继续参考站内用 Apache Tika 处理 PDF 和 Word 的配置方法,按实际格式选择合适的解析引擎。