自宅の家計簿はFirefly IIIを使ってトラッキングしています。
クレジット以外の電子決済はモバイルSUICAを使用しており、SUICAのチャージもクレジット払いで利用額はわかるのですが、何にいくら使ったかがわかりません。
SUICAは電車とコンビニ払いくらいしか使っていないのですが、無駄遣いしてないかを追いたいので利用明細をDBに突っ込んで分析してみようと思います。
別にDBじゃなくてCSVとかでもいいんですが、集計が楽ですからね。
SUICAの明細
JR東日本のサイトから明細をダウンロードできます。
が、PDFでしかダウンロードできません。
まずはこれを出力させないといけませんね。
明細はこんな感じです。(一応モザイクかけます)
PDFのテーブル出力
私はpythonを使えますので
「PDF テーブル python」で検索するとPDFからテーブルを出力するライブラリが主に以下の2つが出てきます。
- tebula
- camelot-py
tebulaはjavaのラッパーのようでjavaもインストールの必要ありなワードがあったのでcamelot-pyを使用することにしました。
あまり環境にあれこれ入れたくないので。
環境
サブ機のubuntuデスクトップを使います。
masashi@PC-ubuntu:~$ uname -r ; lsb_release -a 5.4.0-88-generic No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal
camelot-pyインストール
どんな依存ライブラリが入ってくるかわからないので仮想環境作ります。
masashi@PC-ubuntu:~$ python3 -m venv pdf masashi@PC-ubuntu:~$ source pdf/bin/activate (pdf) masashi@PC-ubuntu:~$ python --version Python 3.8.10 (pdf) masashi@PC-ubuntu:~$ (pdf) masashi@PC-ubuntu:~$ pip list Package Version ------------- ------- pip 20.0.2 pkg-resources 0.0.0 setuptools 44.0.0
依存パッケージのインストール
公式サイトに沿って依存パッケージをインストールします。
(pdf) masashi@PC-ubuntu:~$ sudo apt install ghostscript python3-tk
camelot-pyインストール
本体をインストール。
(pdf) masashi@PC-ubuntu:~$ pip install "camelot-py[base]" Collecting camelot-py[base]
ライブラリの確認
(pdf) masashi@PC-ubuntu:~$ pip list Package Version ---------------- -------- camelot-py 0.10.1 cffi 1.14.6 chardet 4.0.0 click 8.0.2 cryptography 35.0.0 et-xmlfile 1.1.0 ghostscript 0.7 numpy 1.21.2 opencv-python 4.5.3.56 openpyxl 3.0.9 pandas 1.3.3 pdfminer.six 20201018 pdftopng 0.2.3 pip 20.0.2 pkg-resources 0.0.0 pycparser 2.20 PyPDF2 1.26.0 python-dateutil 2.8.2 pytz 2021.3 setuptools 44.0.0 six 1.16.0 sortedcontainers 2.4.0 tabulate 0.8.9
いろいろ入ってきました。
ファイルの読み込み
こちらも公式サイトに沿ってPDFを読み込みます。
ファイル名は日付だけわかるようにリネームしてます。
>>> import camelot >>> >>> tables = camelot.read_pdf('20210825_20210925110904.pdf') >>> tables <TableList n=0> >>> tables.export('suica.csv', f='csv', compress=True) >>> tables[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/masashi/pdf/lib/python3.8/site-packages/camelot/core.py", line 689, in __getitem__ return self._tables[idx] IndexError: list index out of range
なんとSUICAの明細はテーブルとして認識されませんでした…
困りましたねえ。
ということで他のPDF操作ライブラリ
pythonは他にもPDF操作ライブラリがあるので他の手を試してみます。
PyPDF2
開発は終わっているようなのですが使ってみます。
calelot-pyと一緒にインストールされてきました。
「Automate the Boring Stuff with Python」でも出てきます。
>>> import PyPDF2 >>> file = open('20210825_20210925110904.pdf', 'rb') >>> pdfreader = PyPDF2.PdfFileReader(file) >>> pdfreader.numPages 2 >>> pageobj = pdfreader.getPage(0) >>> pageobj.extractText() ')Þ>fl>”>¢>¼ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«>fl>”>¢>¼ˆ‡˛«˜`#㘘˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘˜`#㘘ˆ‡˛«˙v˚g8€ˆ¥'
日本語対応してませんでした…
pdfminer
とりあえず中身を読み取れればなんとかなると思い別のライブラリを試します。
pdfminerは日本語対応しているようです。
こちらもcalelot-pyと一緒にインストールされてきました。
>>> from pdfminer.high_level import extract_text >>> text = extract_text('20210825_20210925110904.pdf') >>> print(text) モバイル Suica 残額ご利用明細 JE*** **** **** 3311 残額履歴 (101件) 利用駅 種別 利用駅 月 08 08 08 08 (略)
読み込みは成功しましたが、行ごとではなく列順で読み込まれて出力されるようなのであまり有効ではありませんね。
pdftotext
shellにもpdfを読み込めるパッケージがあるようなのでこちらも試してみます。
コマンドを実行すると同名のtxtファイルが作成されます。
(pdf) masashi@PC-ubuntu:~/expenses$ pdftotext 20210825_20210925110904.pdf (pdf) masashi@PC-ubuntu:~/expenses$ ls -l 20210825_20210925110904.* -rw-rw-r-- 1 masashi masashi 45899 10月 9 13:11 20210825_20210925110904.pdf -rw-rw-r-- 1 masashi masashi 4682 10月 9 15:50 20210825_20210925110904.txt (pdf) masashi@PC-ubuntu:~/expenses$ cat 20210825_20210925110904.txt モバイル Suica 残額ご利用明細 JE*** **** **** 3311 残額履歴 月 08 08 08 08 08 08 08 (略)
結果はpdfminerと同じですね。
これもダメか…
まとめ
SUICAの利用明細はテーブルとして出力できませんでした。
こうなったら自分でコンバートしてDBにインポートするしかありませんね。
というわけで次回に続きます。
参考サイト
Camelot: PDF Table Extraction for Humans — Camelot 0.10.1 documentation
【Python】pdfminerでPDFからテキストを抽出する | ジコログ
【 pdftotext 】コマンド――PDFファイルからテキストを抽出する:Linux基本コマンドTips(286) - @IT