批量转换文档为纯文本并合并脚本

wen 实用脚本 1

高效文档处理的终极指南

目录导读

  1. 为什么需要批量转换文档为纯文本?

    批量转换文档为纯文本并合并脚本

    • 数据清洗与格式化需求
    • 多格式文档统一处理场景
  2. 核心脚本设计思路

    • 文档解析引擎选择(Python/Node.js)
    • 文件遍历与合并逻辑
  3. 实战代码示例(附注释)

    • 使用Python + python-docx + PyPDF2
    • 递归处理子文件夹
  4. 常见问题与解决方案

    • 编码错误处理
    • 大文件内存溢出优化
  5. 高级扩展:自动化工作流

    • 定时任务与邮件通知
    • 云存储集成

为什么需要批量转换文档为纯文本?

痛点场景

某企业需要将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中表格内容提取不全?

APyPDF2对复杂表格支持有限,可改用pdfplumberPyMuPDF,它们能提取结构化数据后再转为纯文本,推荐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路径即可运行。

上一篇怎么用脚本获取系统名称

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!