Инструмент Python: как обработать данные PDF таблицы

Python
Инструмент Python: как обработать данные PDF таблицы

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Во многих случаях нам приходится иметь дело с файлами в формате PDF. Особенно, когда мы сталкиваемся с данными таблицы PDF, которые необходимо извлечь, это действительно головная боль.

Поскольку файлы PDF нельзя копировать напрямую, как Word, даже если они копируются и вставляются, могут возникнуть проблемы с форматированием и набором текста или даже искаженные символы. Как извлечь табличные данные из файла PDF? В этой статье представлены два решения:

  • camelot
  • tabula

Артефакт 1: Камелот

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

Для получения более подробной информации, пожалуйста, обратитесь к адресу проекта:GitHub.com/Камелот-Дев…

установить камелот

Есть несколько способов установить камелот. Если есть ошибка, обычно есть решения в Интернете:

1. Установить через conda

conda install -c conda-forge camelot-py

2. Установить с помощью pip

pip install "camelot-py[base]"

3. Установить через GitHub

Сначала скопируйте проект на локальный:

git clone https://www.github.com/camelot-dev/camelot

Затем введите файл для установки:

cd camelot

pip install ".[base]"

Случаи применения

Ниже приведен пример, объясняющий, как использовать камелот. Предположим, теперь у нас есть PDF-файл test.pdf только с одной страницей:

1. Сначала прочитайте файл

tables = camelot.read_pdf("test.pdf")
tables

Экспорт данных в формате csv (способ 1)

tables.export('test.csv',   # 导出文件名
              f='csv',   # 导出格式
              compress=True # 文件压缩
             )

Просмотр информации о таблицах:

Метод экспорта 2:

tables[0].to_csv("test1.csv")

Преобразуйте данные в DataFrame:

Артефакт 2: табула

Tabula более мощная, чем camelot, и может одновременно извлекать данные из нескольких таблиц. Конкретный адрес проекта можно найти по адресу:GitHub.com/withdraw/он не…

Установить

Установка tabula очень проста:

pip install tabula-py  # 安装python扩展

После установки убедитесь, что библиотека установлена ​​успешно:

Чтение PDF-файлов

Чтение PDF-файлов через библиотеку tabula:

df1 = tabula.read_pdf("test.pdf",pages="all")

Затем мы обнаруживаем, что единственным элементом в списке является фрейм данных:

вывод в csv файл

Вывести прочитанные данные в файл в формате CSV:

# 方式1:间接输出成csv格式
df2.to_csv("test2.csv")

# 方式2:直接输出成csv格式
tabula.convert_into("test.pdf","test3.csv",output_format="csv",pages='all')

Файл PDF, прочитанный выше, относительно прост, всего одна страница, и это очень стандартная форма данных.Давайте рассмотрим более сложный пример:

  1. В файле PDF всего 3 страницы.
  2. Существуют различия в формате данных таблицы на каждой странице.

Ниже приведена первая страница, первый столбец можно рассматривать как индекс:

На второй странице есть две таблицы с большим количеством пустых строк между ними:

Критерии сравнения данных на третьей странице:

Эти 3 страницы находятся в одном файле PDF, эти 3 страницы находятся в одном файле PDF, эти 3 страницы находятся в одном файле PDF

прочитать первую таблицу

tab1 = tabula.read_pdf("data.pdf",stream=True)
len(tab1)

В красном приглашении выше мы видим, что, когда параметр pages не указан, по умолчанию считываются только данные первой страницы, поэтому длина списка равна 1.

Преобразуйте исходный индекс в новый столбец после преобразования в фреймворк данных(часть данных)

Читать все данные PDF

Прочитать все данные по страницам:

tab2 = tabula.read_pdf("data.pdf",pages="all")   # 获取全部数据all
len(tab2)

Указание страниц = «все»:

  1. Получены данные 4-х таблиц, а длина списка 4
  2. После того, как первая таблица преобразована в данные кадра данных, исходный индекс строки не существует,Это отличается от приведенного выше (без параметра pages)

Получить данные указанной страницы

tab3 = tabula.read_pdf("data.pdf", 
                       pages=3,   # 表示第3页的数据
                       stream=True)
tab3[0]

Получить данные из двух таблиц одновременно:

tab4 = tabula.read_pdf("data.pdf", 
                       pages="1,3",  # 同时2个表格数据
                       stream=True)
len(tab4)  # 长度为2

Прочитать данные указанного места (области)

Указать по параметру площади:

Удалить ненужную информацию

Удаляем ненужную нам информацию о полях в читаемой таблице

вывод файлов в разных форматах

Полученные данные можно выводить в файлы разных форматов, на примере формата json:

 tabula.convert_into("data.pdf",  # 源文件
                    "test4.json",   # 输出文件名
                    output_format="json")  # 文件格式

Мы видим, что