You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多格式文件文本提取至Excel时内容覆盖问题求助

解决多文件文本提取被首个文件内容覆盖的问题

嘿,我看了你的代码,问题根源其实很明显——你的loader函数根本没在处理你传入的那个文件!反而在每个分支里都遍历了整个同类型的文件列表,这就导致不管你传哪个文件进去,返回的内容要么是所有同类型文件的合集,要么是同类型里某一个文件的内容,自然会出现后面的文件被前面内容覆盖的情况。

举个例子,你处理PDF的时候,不管传入的是first_pdf.pdf还是second_pdf.pdf,loader都会遍历所有PDF_files,把所有PDF的文本都塞进data里返回。如果你的后续逻辑是取这个列表的第一个元素,那所有PDF对应的内容都会是第一个PDF的文本,这就是你看到的问题。

下面是修复后的完整代码,我把逻辑拆得更清晰,每个函数只负责处理单个文件:

from pathlib import Path
import pandas as pd
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import docx2txt
from pptx import Presentation

# 单独定义每种文件的文本提取函数,只处理单个文件
def extract_pdf_text(file_path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    with open(file_path, 'rb') as fp:
        for page in PDFPage.get_pages(fp, check_extractable=True):
            interpreter.process_page(page)
    text = retstr.getvalue()
    device.close()
    retstr.close()
    return text

def extract_docx_text(file_path):
    return docx2txt.process(file_path)

def extract_pptx_text(file_path):
    pptx_out = []
    prs = Presentation(file_path)
    for slide in prs.slides:
        for shape in slide.shapes:
            if not shape.has_text_frame:
                continue
            for paragraph in shape.text_frame.paragraphs:
                for run in paragraph.runs:
                    pptx_out.append(run.text)
    return '\n'.join(pptx_out)  # 把列表转成字符串,方便统一存储

def extract_txt_text(file_path):
    with open(file_path, "r", encoding="ISO-8859-1") as f:
        return ''.join(f.readlines())  # 同样转成字符串

# 主加载函数,根据后缀调用对应的提取函数
def loader(file_path):
    suffix = file_path.suffix.lower()  # 转小写避免大小写问题
    if suffix == ".pdf":
        return extract_pdf_text(file_path)
    elif suffix == ".docx":
        return extract_docx_text(file_path)
    elif suffix == ".pptx":
        return extract_pptx_text(file_path)
    elif suffix == ".txt":
        return extract_txt_text(file_path)
    else:
        return ""  # 处理不支持的文件类型

if __name__ == "__main__":
    # 目标目录
    p = Path('C:/Users/XXXX/Desktop/test_folder')
    # 收集所有需要处理的文件(你可以根据需要调整后缀)
    target_files = list(p.rglob('*.txt')) + list(p.rglob('*.pdf')) + list(p.rglob('*.docx')) + list(p.rglob('*.pptx'))
    
    # 收集每个文件的内容和文件名
    data = []
    for file in target_files:
        text_content = loader(file)
        data.append({
            "Text content": text_content,
            "file name": file.name
        })
    
    # 转成DataFrame并输出到Excel
    df = pd.DataFrame(data)
    df.to_excel("extracted_text.xlsx", index=False)
    print("提取完成,结果已保存到extracted_text.xlsx")

关键改动点说明:

  • 拆分提取逻辑:把每种文件类型的提取逻辑单独写成函数,每个函数只处理单个传入的文件路径,不再遍历整个文件列表
  • 修复loader函数:现在loader会根据传入的file_path的后缀,调用对应的提取函数,真正处理当前传入的文件
  • 统一返回格式:所有提取函数都返回字符串类型,方便后续存入DataFrame
  • 统一收集文件:把所有需要处理的文件合并到一个列表里,逐个处理,避免重复遍历

这样修改后,每个文件都会被正确提取自己的内容,不会再出现被首个文件覆盖的问题啦。

内容的提问来源于stack exchange,提问作者Hugo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:23:20