Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输出结果不正确:python中.pdf、.pptx和.docx的文本提取_Python_Python 3.x_File Read - Fatal编程技术网

输出结果不正确:python中.pdf、.pptx和.docx的文本提取

输出结果不正确:python中.pdf、.pptx和.docx的文本提取,python,python-3.x,file-read,Python,Python 3.x,File Read,我创建了一个函数,该函数将打开目录中的每个文件,并从每个文件中提取文本,然后使用Pandas将其输出到excel工作表中。每种文件类型的索引似乎工作正常。但是,当从路径目录中的第一个文件提取文本时,它似乎正在用第一个文件的提取文本替换其他文件中的其他提取文本。请帮忙,谢谢 from pathlib import Path import shutil from datetime import datetime import time from configparser import Config

我创建了一个函数,该函数将打开目录中的每个文件,并从每个文件中提取文本,然后使用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()
输出示例如下: 文本内容文件名 这是一个测试优先\u pdf.pdf

这是第二次测试
  • “second_pdf.pdf”不包含“这是一个测试”,但出于某种原因,它会接收从第一个pdf中提取的任何文本。(对于所有文件类型也是如此
    • 此块

          if path.suffix == ".pdf":
              for name1 in PDF_files:
                   data.append(pdf_to_text(name1))
                   return data
      
      附加第一个PDF文件后从函数返回。它永远不会到达第二个PDF文件,因为您是从
      for
      循环内部返回的。这应该可以修复它:

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

      我们看不到调用
      loader()
      函数的代码。
      data=[]
      只需将open(str(path.resolve()),“r”,encoding=“ISO-8859-1”)作为f:调用一行
      loader()
      就可以了。
      loader()
      是针对每个文件调用一次,还是针对所有文件调用一次。