mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

pythonでpdfの表を読み込む

pythonにtabula-pyというpdfから表を読み込むパッケージがある
インストールと使用時にちょっと戸惑ったのでメモ

やったこと

  1. tabula-pyのインストール
  2. tabula.read()を使う
  3. CSV形式で保存


1. tabula-pyのインストール

pipでインストールしたが、ちょっと手間取った
というのもインストールしたいのは"tabula-py"だが
"tabula"というパッケージもあり
うっかりこちらをインストールしてしまった

"tabula"がなんのパッケージなのか調べなかったが
"tabula-py"と"tabula"では使えるコマンドが違うし
両方入れていても"tabula-py"は正常に動かなくてしばらく悩んだ

それでまず"tabula-py"と"tabula"の両方をアンインストールして
"tabula-py"を再インストールすると正常に動いた

インストールされているパッケージを確認すると
"tabula"と"tabula-py"がインストールされているので
まずは両方アンインストールした

> pip list
tabula              1.0.5
tabula-py           2.6.0
> pip uninstall tabula
> pip uninstall tabula-py

pipのアップグレードを行って
"tabula-py"を再インストール

> pip install --upgrade pip
> pip install tabula-py
> pip list
sympy               1.5.1
tabula-py           2.6.0
terminado           0.8.3

とりあえずこれで準備完了


2. tabula.read()を使う

pdfの読み込みにtabula.read_pdf()を使った
引数はファイルのパスと、表の有無、読み込むページを記述した
filename.pdfから表ありの1ページ目を読み込むときには以下のように記述する

import tabula
tabula.read_pdf(/path/to/filename.pdf, lattice = True, pages = 1)

importに"tabula"と記述するのがややこしい

戻り値は基本DataFrameだが
読み込んだpdfに複数の表があると
リストにまとめられている
例えば2つ目の表の1行目を取り出すには以下のようにする

tabula.read_pdf(/path/to/filename.pdf, lattice = True, pages = 1)[1].iloc[0, :]


3. CSV形式で保存

取り出した表の保存にto_csv()を使用した

df = tabula.read_pdf(/path/to/filename.pdf, lattice = True, pages = 1)[1].iloc[0, :]
df.to_csv(/path/to/filename.csv,  encoding = 'cp932')

windowsを使っているのでencodingにcp932を指定した