【问题标题】:Incorrect output result: Text extraction for .pdf, .pptx, and .docx in python输出结果不正确:python 中 .pdf、.pptx 和 .docx 的文本提取
【发布时间】:2019-04-19 08:44:46
【问题描述】:

我创建了一个函数,它将打开目录中的每个文件并从每个文件中提取文本并使用 Pandas 将其输出到 Excel 表中。每种文件类型的索引似乎工作得很好。但是,当从路径目录中的第一个文件中提取文本时,它似乎正在用第一个文件的提取文本替换从其他文件中提取的其他文本。请帮忙,谢谢!

from pathlib import Path 
import shutil
from datetime import datetime
import time
from configparser import ConfigParser
import glob
import fileinput
import pandas as pd
import os
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

p = Path('C:/Users/XXXX/Desktop/test_folder')

txt_files = list(p.rglob('*txt'))
PDF_files = list(p.rglob('*pdf'))
csv_files = list(p.rglob('*csv'))
docx_files = list(p.rglob('*docx'))
pptx_files = list(p.rglob('*pptx'))


def loader(path):
    with open(str(path.resolve()),"r",encoding = "ISO-8859-1") as f:
        docx_out,pptx_out = [],[]
        data = []
        print(pptx_files)
        if path.suffix == ".pdf":
            for name1 in PDF_files:
                 data.append(pdf_to_text(name1))
                 return data
        elif path.suffix == ".docx":
            for name2 in docx_files:
                docx_out = (docx2txt.process(name2))
                return docx_out
        elif path.suffix == ".pptx":
            for file in pptx_files:
                prs = Presentation(file)
                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 pptx_out
        else:
                return f.readlines()

输出示例为:

文本内容文件名 这是一个测试first_pdf.pdf

这是一个测试 second_pdf.pdf

  • “second_pdf.pdf”不包含“这是一个测试”,但由于某种原因,它包含从第一个 pdf 中提取的任何文本。 (所有文件类型都一样。

【问题讨论】:

  • 我们看不到您调用loader() 函数的代码。
  • data = [] 仅此一行with open(str(path.resolve()),"r",encoding = "ISO-8859-1") as f:
  • 特别不清楚loader() 是打算每个文件调用一次,还是对所有文件调用一次。

标签: python python-3.x file-read


【解决方案1】:

这个区块

    if path.suffix == ".pdf":
        for name1 in PDF_files:
             data.append(pdf_to_text(name1))
             return data

在附加第一个 PDF 文件后从您的函数返回。它永远不会到达第二个,因为您是从 for 循环内部返回的。这应该可以解决它:

    if path.suffix == ".pdf":
        for name1 in PDF_files:
             data.append(pdf_to_text(name1))
         return data

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2013-10-30
    • 2018-03-19
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多