from docx import Document 是一个常见的导入语句,但该写法不正确,会导致 ModuleNotFoundError: No module named 'docx' 错误。
✅ 正确做法是使用 python-docx 库(注意:包名是 python-docx,而非 docx),其标准导入方式为:
from docx import Document
⚠️ 但前提是必须已安装该库:
pip install python-docx
📌 注意事项:
python-docx仅支持.docx(Office Open XML)格式,不支持旧版.doc格式;- 它用于读写 Word 文档内容(文本、段落、表格、样式等),但不支持页眉/页脚/宏/图表渲染等高级功能;
Document类用于创建新文档或打开现有.docx文件;- 示例:
from docx import Document doc = Document() # 新建空白文档 doc.add_paragraph("Hello, World!") doc.save("example.docx")
❌ 常见错误混淆:
import docx→ ❌ 不存在此顶层模块;from docx import *→ ❌ 同样无效;import python_docx或import python-docx→ ❌ 包名含连字符,不能直接 import。
如需处理 .doc 文件或更复杂需求(如 PDF 转换、OCR、模板填充等),需结合其他工具(如 pywin32(Windows)、antiword、libreoffice CLI 或 docxtpl 等)。
使用 python-docx 读取 Word 文档(.docx)中的所有段落和所有表格,核心是遍历 Document 对象的 paragraphs 属性和 tables 属性。注意:表格本身可能嵌套在段落中(如表格前后有文字),但 doc.tables 已按文档顺序返回全部顶层表格(含嵌套在文本框或标题后的表格,不包括表格内嵌套的子表格——python-docx 不支持直接访问嵌套表格,需手动递归解析单元格内容,但当前版本暂无原生 API 支持深层嵌套表遍历)。
✅ 正确示例代码如下:
from docx import Document
def read_docx_content(file_path):
doc = Document(file_path)
# ✅ 读取所有段落(含空段落、标题、列表项等)
print("=== 段落内容 ===")
for i, para in enumerate(doc.paragraphs):
text = para.text.strip()
print(f"[P{i+1}] {repr(text)}") # repr 显示空白符,便于调试
# ✅ 读取所有顶层表格
print("\n=== 表格内容 ===")
for t_idx, table in enumerate(doc.tables):
print(f"\n--- 表格 {t_idx + 1}({len(table.rows)} 行 × {len(table.columns)} 列)---")
for r_idx, row in enumerate(table.rows):
row_cells = [cell.text.strip() for cell in row.cells]
print(f" R{r_idx+1}: {row_cells}")
# 使用示例
# read_docx_content("sample.docx")
📌 补充说明:
para.text返回段落纯文本(不含格式),自动合并同一段内多个run的内容;- 表格中每个
cell.text同样是该单元格内所有段落的.text拼接(用\n分隔),若需精细控制(如保留换行、获取加粗文本),需遍历cell.paragraphs; - 若文档含节(Section)或页眉/页脚,需通过
doc.sections、section.header/section.footer访问,它们也包含paragraphs和tables; python-docx无法读取文本框(Text Box)、艺术字、OLE 对象或受保护/加密文档。
⚠️ 注意:doc.tables 仅返回文档主体(main document part)中的表格,不包含页眉页脚内的表格(需单独访问 section.header.tables 等)。


253

被折叠的 条评论
为什么被折叠?



