Извлечение текста из нескольких PDF-файлов и запись в один CSV - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу провести l oop по всем PDF-файлам в каталоге, извлечь текст из каждого из них с помощью PDFminer, а затем записать вывод в один файл CSV. Я могу извлечь текст из каждого PDF в отдельности, передав его функции, определенной здесь . Я также могу получить список всех имен файлов PDF в данном каталоге. Но когда я пытаюсь соединить их вместе и записать результаты в один CSV, я получаю CSV с заголовками, но без данных.

Вот мой код:

import os
pdf_files = [name for name in os.listdir("C:\\My\\Directory\\Path") if name.endswith(".pdf")] #get all files in directory    
pdf_files_path = ["C:\\My\\Directory\\Path\\" + pdf_files[i] for i in range(len(pdf_files))] #add directory path

import pandas as pd
df = pd.DataFrame(columns=['FileName','Text'])

for i in range(len(pdf_files)):
    scraped_text = convert_pdf_to_txt(pdf_files_path[i])
    df.append({ 'FileName': pdf_files[i], 'Text': scraped_text[i]},ignore_index=True)

df.to_csv('output.csv')

Переменные имеют следующие значения:

pdf_files: ['12280_2007_Article_9000.pdf', '12280_2007_Article_9001.pdf', '12280_2007_Article_9002.pdf', '12280_2007_Article_9003.pdf', '12280_2007_Article_9004.pdf', '12280_2007_Article_9005.pdf', '12280_2007_Article_9006.pdf', '12280_2007_Article_9007.pdf', '12280_2007_Article_9008.pdf', '12280_2007_Article_9009.pdf']

pdf_files_path: ['C:\\My\\Directory Path\\12280_2007_Article_9000.pdf', etc...]

Empty DataFrame
Columns: [FileName, Text]
Index: []

Обновление: по предложению @ AM C Я проверил содержимое scraped_text в l oop. Для столбца «Текст» кажется, что я перебираю символы в первом файле PDF, а не перебираю каждый файл напрямую. Кроме того, содержимое l oop не записывается на фрейм данных или в CSV.

12280_2007_Article_9000.pdf E
12280_2007_Article_9001.pdf a
12280_2007_Article_9002.pdf s
12280_2007_Article_9003.pdf t
12280_2007_Article_9004.pdf  
12280_2007_Article_9005.pdf A
12280_2007_Article_9006.pdf s
12280_2007_Article_9007.pdf i
12280_2007_Article_9008.pdf a
12280_2007_Article_9009.pdf n

1 Ответ

3 голосов
/ 29 февраля 2020

Я думаю, вам не нужно pandas для этого. Вы можете сделать это проще, используя стандартную библиотеку csv.

Еще одна вещь, которую можно улучшить, если вы используете Python 3.4+, это заменить os на pathlib.

Вот почти полный пример:

import csv
from pathlib import Path


folder = Path('c:/My/Directory/Path')
csv_file = Path('c:/path/to/output.csv')

with csv_file.open('w', encoding='utf-8') as f:
    writer = csv.writer(f, csv.QUOTE_ALL)

    writer.writerow(['FileName', 'Text'])

    for pdf_file in folder.glob('*.pdf'):
        pdf_text = convert_pdf_to_txt(pdf_file).replace('\n', '|')
        writer.writerow([pdf_file.name, pdf_text]) 

Еще одна вещь, которую нужно иметь в виду, это убедиться, что pdf_text будет одной строкой или ваш файл csv будет поврежден. Один из способов обойти это - выбрать произвольный символ для использования вместо меток новой строки. Если вы, например, выберете символ трубы, то сможете сделать что-то подобное до writer.writerow:

pdf_text.replace('\n', '|')

Это не полный пример, а отправная точка. Надеюсь, это поможет.

...