Как читать и парсить данные из PDF-файла с помощью Python
Table Of Content
В этом посте я покажу вам, как читать и парсить данные из PDF-файла с помощью Python.
Шаги
Убедитесь, что у вас установлены библиотеки NumPy, pandas и tabula-py,
pip install tabula-py
pip install pandas
pip install numpy
Если они установлены, вам просто нужно сначала их импортировать,
import tabula as tb
import pandas as pd
import numpy as np
В этом случае я буду использовать данные, которые были подведены итоги Организацией Объединенных Наций относительно Прогнозов населения мира на 2019 год, вы можете посмотреть, нажав здесь.
В файле есть таблица, из которой я хочу использовать данные для определенной цели, а именно на странице 12: таблица о населении мира, регионах ЦУР и выбранных группах стран, 2019, 2030, 2050 и 2100 годов, в соответствии с прогнозом среднего варианта.
- Используйте tabula для чтения pdf-файла, который будет использоваться
file='https://population.un.org/wpp/Publications/Files/WPP2019_Highlights.pdf'data = tb.read_pdf(file, pages = '12')
результат будет выглядеть так,
как видно, результат хранится в виде списка, вы можете проверить это самостоятельно, чтобы убедиться
type(data)
# вернет list
- преобразуйте список в dataframe
вы можете использовать вспомогательные функции numpy для этого, потому что если вы преобразуете список напрямую в dataframe таким образом
df = pd.DataFrame(data)
это никогда не получится! вы получите ошибку: ValueError: Must pass 2-d input. shape=(1, 14, 5)
вам нужно сделать это так,
df = pd.DataFrame(np.concatenate(data))
результат будет выглядеть так,
- Удалите значения NaN
df.dropna(inplace=True)
результат будет выглядеть так,
Полученные результаты могут быть достаточными, но, к сожалению, это не то, что мы ожидали, так как мы знаем, что эта таблица хранит все в строках без заголовка для каждого столбца.
В этом случае, согласно таблице в файле, мы будем использовать Регион
и Годы
в качестве ссылок на заголовки для каждого столбца.
- преобразуйте строку в заголовок столбца
df.columns = df.iloc[0]
df = df.drop(0)
df = df.reset_index(drop=True)
результат будет выглядеть так,
До этого момента мы справились хорошо, удачи и спасибо!
Увидимся в следующих постах.