Как извлечь имя таблицы вместе с таблицей, используя camelot, из файлов pdf, используя python? - PullRequest
2 голосов
/ 03 октября 2019

Я пытаюсь извлечь таблицы и имена таблиц из PDF-файла, используя camelot в python. Хотя я знаю, как извлечь таблицы (что довольно просто), используя camelot, я изо всех сил пытаюсь найти какую-либо помощь в том, как извлечь имя таблицы. Намерение состоит в том, чтобы извлечь эту информацию и показать визуальное отображение таблиц и их имен для пользователя, чтобы выбрать соответствующие таблицы из списка.

Я попытался извлечь таблицы, а затем извлечь текст из PDF-файлов. Я успешен в обоих случаях, но не при подключении имени таблицы к таблице.

def tables_from_pdfs(filespath):
    pdffiles = glob.glob(os.path.join(filespath, "*.pdf"))
    print(pdffiles)
    dictionary = {}
    keys = []
    for file in pdffiles:
        print(file)
        n = PyPDF2.PdfFileReader(open(file, 'rb')).getNumPages()
        print(n)
        tables_dict = {}
        for i in range(n):
            tables = camelot.read_pdf(file, pages = str(i))
            tables_dict[i] = tables
        head, tail = os.path.split(file)
        tail = tail.replace(".pdf", "")
        keys.append(tail)
        dictionary[tail] = tables_dict
    return dictionary, keys

Ожидаемый результат - таблица и имя таблицы, как указано в файле PDF. Например: Таблица на странице x названия pdf: Таблица 1. Бла-бла-бла '' 'Таблица' '' *

1 Ответ

0 голосов
/ 03 октября 2019

Таблицы перечислены с помощью функций TableList и Table в API camelot, найденном здесь: https://camelot -py.readthedocs.io / en / master / api.html # camelot.core.TableList


начинается на веб-странице, где написано:


Классы нижнего-нижнего уровня


Камелот не имеет ссылки на имя таблицытолько описания данных ячейки. Он использует API базы данных panda для Python, хотя в нем может быть имя таблицы.


Объедините использование Камелота и Панд для получения имени таблицы.


Получить имя панды DataFrame


добавленное обновление для ответа


из https://camelot -py.readthedocs.io / en / master /

import camelot
tables = camelot.read_pdf('foo.pdf')
tables
<TableList n=1>
tables.export('foo.csv', f='csv', compress=True) # json, excel, html
tables[0]
<Table shape=(7, 7)>
tables[0].parsing_report
{
'accuracy': 99.02,
'whitespace': 12.24,
'order': 1,
'page': 1
}
tables[0].to_csv('foo.csv') # to_json, to_excel, to_html
df_table = tables[0].df # get a pandas DataFrame!

#add
df_table.name = 'name here'


#from https://stackoverflow.com/questions/31727333/get-the-name-of-a-pandas-dataframe
import pandas as pd
df = pd.DataFrame( data=np.ones([4,4]) )
df.name = 'Ones'

print df.name

примечание: добавленный атрибут 'name' не является частью df. При сериализации df добавленный атрибут name теряется.


Более добавленный ответ, атрибут 'name' фактически называется 'index'.


Getting values

>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
...      index=['cobra', 'viper', 'sidewinder'],
...      columns=['max_speed', 'shield'])
>>> df
            max_speed  shield
cobra               1       2
viper               4       5
sidewinder          7       8

Single label. Note this returns the row as a Series.

>>> df.loc['viper']
max_speed    4
shield       5
Name: viper, dtype: int64
...