PythonでPDFをテキスト化
★Pythonの「pdfminer」ライブラリの「extract_text」メソッドによって、PDFファイルをテキストに出力することができます。
例えば、監査人交代の適時開示ですが、データベースとして集約したいときに困るのは、手間がかかりすぎるということです。
➀ひとつひとつPDFファイルを開く
②必要な情報を範囲選択し、コピーし、エクセルにペースト × 必要な箇所の数
1社、2社ならともかく、数十社もあるときにこれではさすがにナンセンスだと思い、Pythonを使って部分的にでも自動化できないか、ということでトライしてみました。
現在の私の技量を踏まえ、工程を以下に分割しました。
- 適時開示から「監査人」「会計士」で監査人交代を検索(手動)
- 抽出されたPDFをダウンロード(手動)
- 各PDFをテキストファイルに出力(Python)
- テキストファイルより、集計したいデータ(公表日、社名、前任、新任等)を選択(手動)
- 選択されたデータをエクセルに出力(python)
今回は、上記3「各PDFをテキストファイルに出力(Python)」のプログラムをご紹介します。
※「#」で始まる行はプログラムには関係ない説明文です。なので、プログラム自体は20行もありません。
# 前提 # pyファイルと同じ階層にPDFファイル群を保管 # ファイル名取得用 import glob # エンコードできない文字列をスキップするため(エンコードエラー回避のため) import codecs # PDF読み込み用 from pdfminer.high_level import extract_text # 階層にあるPDFファイル名をリスト化(list1) # ブランクリストを定義した上で、ファイル名から「.pdf」を削除したものをリスト化(list2) list1 = list(glob.glob('*.pdf')) list2 = [] for i in list1: n = i.replace('.pdf','') list2.append(n) # 作業進捗確認用にlist1,list2をprint print(list1) print(list2) # スタート値を設定しておく n = 0 # len()はリスト内の項目数を返す→PDFファイルの数だけ処理することを指示 # extract_textでテキスト形式として出力 # codecs.open # list2の名称のテキストファイルのハコをセット # 'w'つまり書き込みモード # shift_jisコードでエンコードし、エンコードできないものは'ignore'する # replaceでスペースを削除(邪魔だから) # 最後のprintでtext2をテキストファイルに書き込み for i in range(len(list1)): FILE_PATH = list1[n]text1 = extract_text(FILE_PATH)
with codecs.open(list2[n] + '.txt', 'w','Shift_jis', 'ignore') as f:
text2 = text1.replace(' ','') print(text2, file=f) f.close()
# nを+1することで、次のPDFファイルの処理へ(以降ループ)n += 1
独学なのできっとヘンテコなところがあるのだろうなとは思いますが、独学でここまで作れるので、Pythonは使いやすいプログラミング言語だと言われるのもわかる気がします。
また、いろいろサイトでPythonの解説がなされているのもありがたい限りです。
ご参考になれば幸いです。
竹内由多可