高效文档处理的终极指南
目录导读
-
为什么需要批量转换文档为纯文本?

- 数据清洗与格式化需求
- 多格式文档统一处理场景
-
核心脚本设计思路
- 文档解析引擎选择(Python/Node.js)
- 文件遍历与合并逻辑
-
实战代码示例(附注释)
- 使用Python +
python-docx+PyPDF2 - 递归处理子文件夹
- 使用Python +
-
常见问题与解决方案
- 编码错误处理
- 大文件内存溢出优化
-
高级扩展:自动化工作流
- 定时任务与邮件通知
- 云存储集成
为什么需要批量转换文档为纯文本?
痛点场景
某企业需要将500份Word/PDF产品说明书合并为单一TXT文件用于NLP模型训练,手动操作需3天且易出错,而自动化脚本仅需10秒。
核心需求
- 格式统一:DOCX、PDF、HTML、TXT等格式需转为纯UTF-8文本 合并**:按文件名排序或自定义顺序拼接
- 去格式化:移除表格、图片、页眉页脚等非文本元素
核心脚本设计思路
技术选型对比
| 语言/工具 | 适用格式 | 优点 | 缺点 |
|---|---|---|---|
Python + python-docx + PyPDF2 |
DOCX, PDF, TXT | 生态完善,代码简洁 | 安装依赖稍多 |
Node.js + mammoth + pdf-parse |
同上 | 异步性能好 | 处理复杂格式需额外库 |
Shell脚本 + pandoc |
多格式 | 无需编程 | 依赖外部工具配置 |
推荐方案:Python(跨平台且易于调试)
文件遍历逻辑
import os
from pathlib import Path
def find_docs(root_path):
"""递归获取所有支持文件"""
for ext in ['*.docx', '*.pdf', '*.txt', '*.html']:
yield from Path(root_path).rglob(ext)
实战代码示例(带注释)
完整脚本:convert_merge.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量转换文档为纯文本并合并
支持格式:DOCX, PDF, TXT, HTML
合并顺序:按文件名自然排序
输出:merged_output.txt
"""
import os
import re
from pathlib import Path
from docx import Document
from PyPDF2 import PdfReader
# ---------- 解析引擎 ----------
def extract_text_from_docx(filepath):
"""从DOCX提取纯文本"""
doc = Document(filepath)
return '\n'.join([p.text for p in doc.paragraphs if p.text.strip()])
def extract_text_from_pdf(filepath):
"""从PDF提取纯文本(逐页处理)"""
reader = PdfReader(filepath)
text = ""
for page in reader.pages:
text += page.extract_text() + '\n'
return text
def extract_text_from_txt(filepath):
"""读取TXT文件(自动检测编码)"""
with open(filepath, 'rb') as f:
raw = f.read()
# 尝试UTF-8,失败则用GBK
try:
return raw.decode('utf-8')
except UnicodeDecodeError:
return raw.decode('gbk')
def extract_text_from_html(filepath):
"""从HTML提取可见文本"""
from bs4 import BeautifulSoup
with open(filepath, 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'html.parser')
return soup.get_text(separator='\n', strip=True)
# ---------- 核心处理 ----------
def convert_and_merge(input_dir, output_file='merged_output.txt'):
"""主函数:遍历目录→提取文本→合并输出"""
extractors = {
'.docx': extract_text_from_docx,
'.pdf': extract_text_from_pdf,
'.txt': extract_text_from_txt,
'.html': extract_text_from_html
}
all_texts = []
# 自然排序(忽略大小写)
files = sorted(Path(input_dir).rglob('*'), key=lambda x: str(x).lower())
for filepath in files:
ext = filepath.suffix.lower()
if ext in extractors:
try:
text = extractors[ext](filepath)
# 添加文件标识头
header = f"\n--- FILE: {filepath.relative_to(input_dir)} ---\n"
all_texts.append(header + text)
print(f"✓ 已处理: {filepath.name}")
except Exception as e:
print(f"✗ 错误 {filepath.name}: {str(e)}")
# 写入合并文件
with open(output_file, 'w', encoding='utf-8') as f:
f.write('\n'.join(all_texts))
print(f"合并完成!文件大小: {os.path.getsize(output_file)/1024:.2f} KB")
if __name__ == '__main__':
# 使用示例
convert_and_merge('/path/to/your/documents', 'all_merged.txt')
执行命令
pip install python-docx PyPDF2 beautifulsoup4 python convert_merge.py
常见问题与解决方案(Q&A)
Q1:PDF中表格内容提取不全?
A:PyPDF2对复杂表格支持有限,可改用pdfplumber或PyMuPDF,它们能提取结构化数据后再转为纯文本,推荐pdfplumber:
import pdfplumber
with pdfplumber.open(filepath) as pdf:
text = ''.join([page.extract_text() for page in pdf.pages])
Q2:处理1000+文件时内存溢出?
A:采用流式写入,避免全量加载:
with open(output_file, 'w', encoding='utf-8') as f:
for filepath in files:
f.write(extract_text(filepath) + '\n')
同时可按文件大小分批处理(如每500个文件重启一次脚本)。
Q3:合并后出现乱码(如中文变问号)?
A:确保所有读取编码一致,PDF需设置encoding='utf-8',对于老式TXT文件可用chardet自动检测编码:
import chardet
with open(filepath, 'rb') as f:
result = chardet.detect(f.read())
encoding = result['encoding']
Q4:需要保留原始文件修改时间?
A:在合并文件名上添加时间戳:
from datetime import datetime
timestamp = datetime.fromtimestamp(os.path.getmtime(filepath)).strftime('%Y%m%d_%H%M%S')
header = f"\n--- {filepath.name}|{timestamp} ---\n"
高级扩展:自动化工作流
定时监控目录
使用watchdog库监控文件夹,新文件自动触发转换:
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class DocHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
convert_and_merge(event.src_path)
云存储集成(以阿里云OSS为例)
import oss2
bucket = oss2.Bucket(auth, '你的Endpoint', 'bucket名')
for obj in oss2.ObjectIterator(bucket):
# 下载→转换→上传合并结果
输出格式个性化
- 统计信息:在输出文件末尾添加文档数量/总字数统计
- 元数据保留:将文件属性(创建者、标题)写入注释行
本文从实际痛点出发,提供了一套完整的“批量转换文档为纯文本并合并”的Python解决方案,相较于手动操作,脚本能提升90%以上效率,且易于扩展至企业级流水线,建议根据真实数据量(小规模推荐完整版,超大规模推荐流式版)选择合适的实现方式,对于日常使用,仅需修改示例中的input_dir路径即可运行。