Неверный вывод: при извлечении текста из pdf файлы docx из pptx не будут выводиться в отдельной строке - PullRequest
0 голосов
/ 19 апреля 2019

Я создал функцию, которая будет открывать каждый файл в каталоге, извлекать текст из каждого файла и выводить его в лист Excel с помощью Pandas. Индексация для каждого типа файлов, кажется, работает просто отлично. Однако извлеченный текст из каждого файла появляется рядом друг с другом в списке, а не разделяется и рядом с соответствующим файлом.

Смотрите в нижней части скрипта текущий вывод и вывод, который я хочу.

** Я считаю, что проблема заключается в функции loader (), которая принимает путь, просматривает каждый файл каталога, проверяет файл .ext и извлекает текст.

Спасибо!

import re
#import PyPDF4
import pathlib
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
import more_itertools as mit



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


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'))
#excel_files = list(p.rglob('xls'))




def pdf_to_text(x):

    # PDFMiner 
    rsrcmgr = PDFResourceManager()
    sio = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, sio, codec=codec, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)

    # Extract text
    fp = open(x, 'rb')
    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
    fp.close()

    # Get text from StringIO
    text = sio.getvalue()

    # Cleanup
    device.close()
    sio.close()

    return text

#-------------------------------------------------------------------------------

def loader(path):
    with open(str(path.resolve()),"r",encoding = "ISO-8859-1") as f:
        docx_out,pptx_out,pdf_out = [],[],[]
        if path.suffix == ".pdf":
            for name1 in PDF_files:
                pdf_out.append(pdf_to_text(name1))
            return pdf_out
        elif path.suffix == ".docx":
            for name2 in docx_files:
                docx_out.append(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()

print(pdf_out)



def file_generator():
    files = txt_files+PDF_files+csv_files+docx_files+pptx_files
    for item in files:
        yield {
            "path": item,
            "name": item.name[0:],
            "created": time.ctime(item.stat().st_ctime),
            "modified": time.ctime(item.stat().st_mtime),
            "content": loader(item) 
        }


def to_xlsx():
    df = pd.DataFrame.from_dict(file_generator())
    df.head()
    df.to_excel("tester4.xlsx")

if __name__ == "__main__":
    to_xlsx()
#------------------------------------------------------------
OUTPUT EXAMPLE

current output:                                
  content
["content_test1","content_test2"]  test1.pdf
["content_test1","content_test2"]  test2.pdf

What I want:
["content_test1"]  test1.pdf
["content_test2"]  test2.pdf

1 Ответ

1 голос
/ 19 апреля 2019

Приложения, вызываемые каждой функцией filetype_out, выглядят так, будто они добавляют содержимое каждого файла в конец списка, относящегося к этому типу файла. Если вы хотите создать уникальный список с содержимым каждого отдельного файла, я бы порекомендовал создать отдельный dict для каждого типа файла, который затем включает отдельные списки для каждого обработанного файла. Взяв в качестве примера PDF-файлы:

def loader(path):
    with open(str(path.resolve()),"r",encoding = "ISO-8859-1") as f:
        docx_out,pptx_out,pdf_out = {},{},{}
        if path.suffix == ".pdf":
            for name1 in PDF_files:
                name1_contents = []
                name1_contents.append(pdf_to_text(name1))
                pdf_out[name1] = name1_contents
            return pdf_out

Чтобы затем распечатать результаты аналогично тому, как вы это делали:

for name, contents in pdf_out:
    print(contents + '  ' + name)
...