Python Word批量转纯文本txt:提取正文
用python-docx批量把Word文档转换成纯文本txt,保留段落和表格内容,适合做语料清洗、全文检索、导入数据库或喂给大模型。
场景痛点
做语料分析、问答知识库、全文检索时,需要把大量Word文档里的文字抽出来存成txt。手动复制粘贴不仅慢,还会丢掉表格、换行结构。用python-docx直接解析docx的XML结构,段落和表格都能一次性提取,批量跑一整个文件夹。
用到的库
pip install python-docx
完整代码
# -*- coding: utf-8 -*-
"""
批量把 .docx 转成 .txt,保留段落顺序和表格内容
"""
from pathlib import Path
from docx import Document
from docx.document import Document as _Doc
from docx.table import Table
from docx.text.paragraph import Paragraph
from docx.oxml.ns import qn
def iter_block_items(parent: _Doc):
"""按文档真实顺序遍历段落和表格(python-docx默认把段落和表格分开取)"""
body = parent.element.body
for child in body.iterchildren():
if child.tag == qn('w:p'):
yield Paragraph(child, parent)
elif child.tag == qn('w:tbl'):
yield Table(child, parent)
def docx_to_text(doc_path: Path) -> str:
"""把单个 docx 转成纯文本,段落和表格按顺序拼接"""
doc = Document(str(doc_path))
lines = []
for block in iter_block_items(doc):
if isinstance(block, Paragraph):
text = block.text.strip()
if text:
lines.append(text)
elif isinstance(block, Table):
# 表格按行输出,单元格用制表符分隔
for row in block.rows:
cells = [cell.text.strip().replace('\n', ' ') for cell in row.cells]
lines.append('\t'.join(cells))
return '\n'.join(lines)
def batch_convert(input_dir, output_dir):
input_dir = Path(input_dir)
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
docx_files = [f for f in input_dir.glob("*.docx") if not f.name.startswith("~$")]
print(f"共 {len(docx_files)} 个文档待转换")
for docx_file in docx_files:
try:
text = docx_to_text(docx_file)
txt_path = output_dir / (docx_file.stem + ".txt")
# 用 utf-8-sig 保存,记事本打开不乱码
txt_path.write_text(text, encoding="utf-8-sig")
print(f"✓ {docx_file.name} -> {txt_path.name} ({len(text)} 字符)")
except Exception as e:
print(f"✗ {docx_file.name} 失败:{e}")
if __name__ == "__main__":
batch_convert(
input_dir="./word_docs",
output_dir="./txt_output",
)
代码讲解
直接用 Document.paragraphs 只能拿到段落,Document.tables 只能拿到表格,两者会打乱文档原有顺序。所以写了 iter_block_items(),直接遍历 docx 底层 XML 的 body 节点,遇到 w:p 当段落处理,遇到 w:tbl 当表格处理,保证正文阅读顺序和Word里一致。
表格部分把每一行单元格用制表符 \t 拼起来,后续想转CSV或者喂给pandas都很方便。
保存时用 utf-8-sig 而不是普通 utf-8,多写一个BOM头,Windows 记事本打开中文不会乱码。
运行结果
txt_output 目录下每个源docx对应一个同名txt。用记事本或VS Code打开,段落一行一条,表格一行一条且列对齐。控制台会打印每个文件的字符数,方便快速判断有没有抽取到内容(字符数为0说明文档是空的或加密了)。
注意事项
- 只能处理
.docx格式,老的.doc二进制格式读不了,需要先用LibreOffice批量另存为docx。 - 文本框、页眉页脚、脚注里的文字默认不提取,需要额外遍历
doc.sections的 header/footer。 - 图片里的文字提取不出来,要OCR得另外接PaddleOCR。
- 超链接的文字能提取到,但链接URL本身会丢失。

更新时间:2026-09-14 21:42:12
上一篇:Python给PDF添加图片水印:Logo铺满每页防篡改