Ошибка при преобразовании PDF в текстовый файл - PullRequest
0 голосов
/ 21 января 2019

Я написал функцию, которая преобразует каждый PDF-файл из каталога в текст, и я хочу получить преобразованный текст из PDF-файлов в виде TXT-файлов.Я получаю ошибку "TypeError: ожидаемый объект str, bytes или os.PathLike, а не tuple" в моем коде.Может кто-нибудь, пожалуйста, помогите мне с этим.Прикрепленный код здесь:

import io
import os
import os.path
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfpage import PDFPage

    def extract_text_from_pdf(pdf_path):
        resource_manager = PDFResourceManager()
        fake_file_handle = io.BytesIO()
        converter = TextConverter(resource_manager, fake_file_handle)
        page_interpreter = PDFPageInterpreter(resource_manager, converter)

        with open(pdf_path, 'rb') as fh:
            for page in PDFPage.get_pages(fh, 
                                          caching=True,
                                          check_extractable=True):
                page_interpreter.process_page(page)

            text = fake_file_handle.getvalue()

        # close open handles
        converter.close()
        fake_file_handle.close()

        if text:
            return text

    def save_to_txt(lst):
            for i, ele in enumerate(lst): 
                txtfile = "{}.txt".format(i)
                files = extract_text_from_pdf(ele)
                with open(txtfile, "w") as textfile:
                    textfile.write(files) 

    if __name__ == '__main__':
        pdf_path = 'C:\\Users\\Lenovo\\.spyder-py3\\OCR'
        for root, _, files in os.walk(pdf_path):
            for filename in files:
                filepath = os.path.join(root, filename)
                extract_text_from_pdf(filepath)

        for f in filepath:
            save_to_txt(f)

Ошибка выглядит следующим образом:

runfile('C:/Users/Lenovo/.spyder-py3/updatedpy.py', wdir='C:/Users/Lenovo/.spyder-py3')
Traceback (most recent call last):

  File "<ipython-input-17-f6b3bb00c382>", line 1, in <module>
    runfile('C:/Users/Lenovo/.spyder-py3/updatedpy.py', wdir='C:/Users/Lenovo/.spyder-py3')

  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Lenovo/.spyder-py3/updatedpy.py", line 47, in <module>
    extract_text_from_pdf(file)

  File "C:/Users/Lenovo/.spyder-py3/updatedpy.py", line 22, in extract_text_from_pdf
    with open(pdf_path, 'rb') as fh:

TypeError: expected str, bytes or os.PathLike object, not tuple

1 Ответ

0 голосов
/ 21 января 2019

Ошибка возникает из-за использования в главном разделе метода os.walk, который возвращает не имя файла, а кортеж. Подробнее см. Документацию os .

Редактировать : Вы можете использовать метод os.walk следующим образом:

for root, _, files in os.walk(pdf_path):
    for filename in files:
        filepath = os.path.join(root, filename)
        extract_text_from_pdf(filepath)

Или Вы можете использовать библиотеку path.py и использовать метод walkfiles . Таким образом, вы могли бы сделать:

from path import Path

pdf_path = Path('C:\\dev') 

for file in pdf_path.walkfiles():
    extract_text_from_pdf(file)
...