HOME >> 鉄道模型実験室 > Pythonを触ってみよう PDFファイルからの情報取込み 

鉄道模型実験室 No.216  Pythonを触ってみよう PDFファイルからの情報取込み   

 80の手習いとしてPython に触れている。 今回は応用問題として、市のウエブサイトで公開されているPDFファイルからデータ情報を取込みに、先の報告の様に新型コロナ感染者数の推移グラフを作成した。

  .

  .

  

 

■ 新しい教則本に従ってPDFファイルを読込む

 新しい開発環境である JupyterLab の操作方法を一通り理解したので、早速、第5章のPDFの自動化に挑戦した。 まず、PDFファイルを操作するためのライブラリーとして、PyMuPDF ライブラリーをインストールしました。 でも、なぜだかライブラリーの名称は fitz に変わるそうです。

 

● 全頁のテキストをファイルの保存する

 手始めに、教則本に従ってPDFファイルの中のテキストを抽出してファイルに保存してみることにしました。 その内容を下に示します。

import fitz
file = fitz.open('20220718-20220724kansensha.pdf')
output = open('20220718.txt','w',encoding='UTF-8')
for page in file:
    text = page.get_text()
    output.write(text)
output.close()
file.close()

 

 

 

 

 

 

 

 ファイルを操作するための変数 output を用意し、open 関数を使ってPDFファイルを開きます。 そして、書出すファイルも用意し、そこにテキストを書込んで保存させます。

 対象としたPDFファイルは「Pythonを触ってみよう まず基礎から」で紹介した表形式のPDFファイルです。

 書出されたテキストファイルを EmEditor で開いたものを右に示します。 これを見ると、PDFファイルから確かにテキスト部分を書出していることは分かるのですが、取出されたテキストは一列に縦に並んでしまっています。

 各テキスト毎に改行(下向きの矢印 ↓)が入っており、どれが一つのデータセットなのか判断できません。 即ち、表データの一行毎のデータとしてのセットにはなっていないのです。

 これでは、解析のためのデータにならないのは明らかです。 つたない知識で readlines など、過去に使ったことのあるコマンドを使ってみましたが、エラーとなって、前に進めませんでした。

 

■ PDFの表を読取る他の方法

 諦めるのも早いのです。 ネットで表の取込方法を検索すると、Tabula-py を使うと一発で実行できるとのことで、この方法にトライしました。 このライブラリーは、Java を使うとのことですので、Java もインストールし、 Tabula-py もインストールしました。

 そして、早速、上記の表形式PDFファイルを取込んでみました。 一行毎のデータの形式を崩さすに取込むことが出来たのですが、その後の処理に四苦八苦でした。 ある場面でのスクリーンショットを紹介します。

 セルと呼ばれている命令文のブロックの前に、薄い文字で、[19] と表示されているのが見えますが、19番目のトライであることを示しています。 そしてセルの下には、命令を走らせた結果を表示しています。 Python はインタプリタ方式の言語ですから、RUN させた結果をすぐに表示してくれます。 

 page='1' と記入している部分は、PDFファイルの1ページだけを読み込めという命令ですが、その結果を表示させるためのprint 命令の中で、a[0] とリストの1番目(インデックス番号は0となる)を指定すると、セルの下に結果を表示します。  しかし、インデックス番号を1にすると何も表示されないのです。 なんで?

    *******************************************************************

 どうして右往左往しているのか、説明しておく必要がありますね。 日毎の患者数を集計するためには、データを仕分けする必要があります。

  1. 発生日付け毎に区分けすること。
  2. 年代別に区分けすること。

 2番目の区分けは先回の報告の様に簡単に実施できましたが、1番目の発生日付け毎の区分けが出来ないのです。 データ上は、R4.7.24 と明記されているのですが、この文字は毎日変化していきます。 そこで、今までに無い日付に遭遇すると新しい日付として処理を進めればよいのですが、この日付けのデータが切出せないのです。 即ち、年代別とか性別など、既知のデータの有無は簡単に判断できるのですが、新しいデータの場合は探せないのです。 何が新しいのかを認識させる必要があるのです。 このためには、データの位置を知っておく必要があり、そのデータの差異を判断する必要があるのです。

 この処理が出来なかったので、先回は手動で日付毎のファイルを作成して件数集計を実施しました。 今回の手法では、この難問が解決できると期待したのですが、やはりダメでした。 

   *******************************************************************

 上記の様なトライや、出力されたテキストファイルを EmEditor で開いて制御記号の位置などを調べた結果、次のことが分かりました。

 知識と経験に乏しい身としては、うまい工夫が見出せなかったので、やはり手動で対象の日付を入力することにしました。 こうすると指定の日付のデータだけを拾ってきて集計することが出来ようになりました。

 途中で、書出し用の output-all.txt ファイルを作っていますが、これはPDFファイルからテキストを正常に取込んでいるかどうかの確認用として作ったものですので、本来は必要ない処理です。 また、元のデータの一行分は改行文字もそのまま取込んでいるので、これを利用してデータセットとして切り分けることが出来ています。 そして、その中に、指定の文字列が含まれているがどうかを判断しながら、集計を進めています。

 集計結果は、セルの下に表示されますので、コピー/ペーストによって、集計用のメモ帳にペーストしていきます。 全ての日付け集計が終わるとそのメモ帳をExcelに読み込ませて、グラフ化の処理を実施します。

 

■ 実施例

 先回と同様に、集計結果を紹介します。 得られた集計データをExcelにてグラフ化しました。

 年代別の個別グラフも作成しました。

 7月の中旬から10歳未満から感染拡大が始まっていることが読取れます。 これは保育園や幼稚園、さらには小学校がクラスターとなっているようです。 その後、10歳代に拡大していますので、学校関係での感染が増加したものと考えられます。 これらの世代は親と同居しているので、感染場所は家庭内に移行し、親の世代の20代、30代、40代へと広がっています。 特に、10歳未満と30代、および、10歳代と40代がシンクロしているとも読取れます。

 また、10歳未満は夏休みに入ったためか頭打ち状態ですが、それ以外は増加傾向です。 特に50代と60台がじわじわと増加しているのも不気味ですね。 後期高齢者の小生も用心しなければならないです。

 

■ あとがき

 Python の活用の仕方をひとつ覚えました。 でも、まだまだ知識と経験に乏しいので、上手に処理することが出来ていません。 今回の壁となった不特定な半角スペースを含む文字列の中から、文字だけを取り出してリスト化する方法を見いだせれば、さらに自動化が可能となります。

 今回も鉄道模型とは関係ないのですが、意欲が萎えないうちにトライしてみたいと思います。

 

ページトップへ戻る  .


 2022/8/2