Python tabula-py error (ошибка панд?)

После некоторого чтения онлайн я решил использовать tabula-py для извлечения таблиц из PDF-файлов. Мы используем Anaconda, и я только что установил tabula-py 1.1.1.

Я хотел начать с простого скрипта и посмотреть, что он будет делать с одностраничным pdf-файлом с текстом и двумя таблицами ("table_p16.pdf").

Код:

from tabula import read_pdf
df = read_pdf("table_p16.pdf")

Ошибка:

Подобрал JAVA_TOOL_OPTIONS: -Djava.security.properties = c: \ Windows \ Sun \ Java \ Deployment \ sam.security

Traceback (последний вызов был последним):

Файл "H:/Personlich/SVN/blademat_tb/blademat_toolbox/utility/read_pdf.py", строка 41, в df = read_pdf("table_p16.pdf")

Файл "C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\tabula\wrapper.py", строка 117, в файле read_pdf возвращает pd.read_csv(io.BytesIO(вывод), **pandas_options)

Файл "C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py", строка 709, в parser_f возвращает _read(filepath_or_buffer, kwds)

Файл "C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py", строка 455, в _read data = parser.read(nrows)

Файл "C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py", строка 1069, в read ret = self._engine.read(nrows)

Файл "C:\Users\xxxxxxxxxxxx\AppData\Local\Continuum\Anaconda3\envs\test_env\lib\site-packages\pandas\io\parsers.py", строка 1839, в файле read data = self._reader.read(nrows)

Файл "pandas/_libs/parsers.pyx", строка 902, в файле pandas._libs.parsers.TextReader.read

Файл "pandas/_libs/parsers.pyx", строка 924, в файле pandas._libs.parsers.TextReader._read_low_memory

Файл "pandas/_libs/parsers.pyx", строка 978, в файле pandas._libs.parsers.TextReader._read_rows

Файл "pandas/_libs/parsers.pyx", строка 965, в файле pandas._libs.parsers.TextReader._tokenize_rows

Файл "pandas/_libs/parsers.pyx", строка 2208, в файле pandas._libs.parsers.raise_parser_error

pandas.errors.ParserError: Ошибка токенизации данных. Ошибка С: ожидается 8 полей в строке 9, пила 9

Вещи, которые я пробовал:

  • Так как ошибка, кажется, показывает проблемы с пандами, я попытался прочитать одну страницу PDF с одной таблицей. Та же ошибка имеет место.
  • Установите переменную пользователя PATH в Java. Ничего не изменилось. Не могу установить системную переменную PATH в Java, так как она в настоящее время используется для нашей программы SVN.
  • Различные строки кода с одинаковой ошибкой:

    df = read_pdf(r"table_p9.pdf")
    df = read_pdf(r"table_p9.pdf")
    df = read_pdf("table_p9.pdf", output_format='json')
    

Я надеюсь, что кто-то может помочь и понять, в чем проблема. Это может быть проблема с Java, но я не настолько знаком с необходимым взаимодействием Java. Ваша помощь очень ценится.

редактировать

Я пробовал разные таблицы, и некоторые, кажется, работают. Было трудно определить, какой тип таблиц работает. Некоторые с "объединенными" столбцами, а другие с "объединенными" строками, похоже, работают. Но явно не все. Кроме того, я не смог прочитать несколько таблиц (2 или 3), используя аргумент multip_tables=True.

Есть ли какой-нибудь источник для таблиц, которые Табула может обрабатывать? И это заставляет меня задуматься, является ли Tabula подходящей программой для использования. После всего, что я прочитал, у меня сложилось впечатление, что Табула будет в этом хорош. Таблицы, с которыми, кажется, борются, не сложны.

Есть ли ясный и простой источник о том, как максимально использовать Табулу? Или советы о том, как обращаться с таблицами, с которыми борется Табула?

С уважением, Габриэль

1 ответ

Это грубое руководство для параметров tabula (или tabula-py).

1) Слив ячейки с разлинованным столом, вы можете использовать lattice=True вариант. В режиме решетки tabula соответствующим образом обрабатывает строки таблиц. Обратите внимание, что вам может понадобиться после редактирования какой-нибудь заполнитель для объединенных ячеек. Я испытал некоторые объединенные столбцы извлечены с выравниванием по левому краю

AFAIK, Табуле довольно трудно извлечь объединенную ячейку без строки таблицы.

Общие настройки для Tabula: lattice, stream, guess,

2) Наличие нескольких таблиц на одной или нескольких страницах. Это специфическая опция tabula-py, вы должны использовать multiple_tables=True вариант.

По умолчанию tabula-py пытается извлечь таблицы через CSV. Хотя этот подход может получить выгоду от функции pandas.read_csv, например, вывод имен столбцов. read_csv предполагает одну таблицу (такую ​​же таблицу размеров столбцов) в PDF. pandas.read_csv с разным размером столбцов вызывает ParserError.

С другой стороны, с multiple_tables опция tabula-py создает DataFrame через JSON, который может представлять несколько таблиц.

Еще один вариант. В tabula-py 1.3.0 вы можете использовать шаблоны приложений Tabla с tabula-py. Получая данные о площади из шаблона, вы можете извлечь более точную информацию о площади.

Другие вопросы по тегам