python-docx仅支持.docx格式,不支持旧版.doc;读取时需用Document加载文件并遍历paragraphs提取文本,表格、页眉页脚等内容需额外遍历tables等对象;.doc文件须用antiword或win32com转换后处理。

用 python-docx 读取 .docx 文件内容
python-docx 只支持 .docx(Office 2007+),不支持旧版 .doc 格式。如果遇到 PackageNotFoundError 或读取失败,大概率是文件后缀为 .doc 但实际不是真 .docx ——建议先用 LibreOffice 或 Word 手动另存为 .docx。
安装后直接加载文档,逐段提取文本即可:
from docx import Document
<p>doc = Document("report.docx")
text = "\n".join([p.text for p in doc.paragraphs])
with open("report.txt", "w", encoding="utf-8") as f:
f.write(text)注意:doc.paragraphs 不包含表格内的文字、页眉页脚、文本框内容;若需这些,得额外遍历 doc.tables、doc.sections 等对象。
处理 .doc 文件必须用 antiword 或 win32com
原生 Python 没有稳定解析 .doc 的库。Linux/macOS 下推荐 antiword 命令行工具,Windows 下可用 win32com.client 调用 Word 进程(需本地装 Office)。
立即学习“Python免费学习笔记(深入)”;
antiword 安装与调用示例(终端执行):
sudo apt install antiword # Ubuntu/Debian antiword input.doc > output.txt
在 Python 中批量调用:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
import subprocess import os <p>for doc_file in ["a.doc", "b.doc"]: txt_file = os.path.splitext(doc_file)[0] + ".txt" subprocess.run(["antiword", doc_file], stdout=open(txt_file, "w", encoding="utf-8"))
⚠️坑点:antiword 对中文支持较弱,默认输出 GBK 编码,建议加 -x utf8 参数(新版支持);win32com 方式会弹出 Word 窗口、速度慢、不能并发,且无法在无桌面环境(如 Linux 服务器)运行。
保留基础格式(如标题层级、列表)的简单增强方案
纯文本丢失结构信息,但加几行标记就能提升可读性。比如把 paragraph.style.name 为 "Heading 1" 的段落前加 ### ,把 paragraph.style.name 含 "List" 的加 - 。
关键判断逻辑如下:
for p in doc.paragraphs:
if "Heading 1" in p.style.name:
text_lines.append("### " + p.text)
elif "List" in p.style.name:
text_lines.append("- " + p.text)
else:
text_lines.append(p.text)注意:p.style.name 在不同 Word 模板下可能叫 "标题 1"(中文系统)或 "Heading 1"(英文模板),建议先打印几个段落的 p.style.name 和 p.text 看实际值再写条件。
批量转换时的路径与编码陷阱
Windows 下常见错误:用 open(..., "w") 写入中文却没指定 encoding="utf-8",导致 UnicodeEncodeError 或乱码;macOS/Linux 下默认是 UTF-8,但 Windows 默认是 cp1252。
- 统一显式声明
encoding="utf-8" - 输入路径含中文时,用
os.path.join()或pathlib.Path构造,避免手动拼接反斜杠出错 - 跳过非 .doc/.docx 文件:检查
file.lower().endswith((".docx", ".doc"))
真正麻烦的是混合格式目录——比如既有 .docx 又有 .doc,还夹着 PDF。这时候别硬写一个函数全包,分两路处理更稳:先用 glob 分开两类文件,再分别走 python-docx 或 subprocess 流程。

















