potass' blog

ポタシウムのことが書いてないブログ。

Excel ファイルを Python 3.2 で読む

地方の役所が出している人口統計を python で拾って簡単な分析をしてみよう!*1と思った。
…が一番の山場はすぐに来る。
Excel ファイルばっかじゃねーか!!*2
こりゃ Excel ファイルを Python で読めるようにしとかんとアカンと感じたのでそれのお勉強。*3

Python-Excel を使う

モジュールとしては

  • pyExcelerator
  • python-excel(xlrd : 書き込み用、xlwt : 書き込み用、xlutils : 前の2つともが入ってないとダメなもんで utility らしい)

の2つが有名らしいです。
前者は開発が止まってる(?)のか最近更新されていなく、Python 3 でちゃんと動くのか謎だったので後者を選択。

インストール

xlrd は pip で瞬殺。

$ pip install xlrd

xlwt は 2.x しか保証しないらしい。現在は xlwt-future なるものに移行してるがこれは 2.6/2.7/3.3+ らしい。マジか…。
ただ、wlrt3 なるものがあるらしくこれは 3.1+ らしい。よかった。*4

$ pip install xlwt3

最後の xlutils は pip でインストールを試みたが上手くいかない。
GitHub の xlutils/docs/installation.txt には "This package is support on Python 2.5, 2.6 and 2.7 on Linux, Mac OS X and Windows." とあるな。まあいいや。

下準備 - Pythonwget のインストール

$ pip install wget

で OK。

やること

Excel データファイルを落としてくる

今回は高山市の各年の月別人口統計データを使ってみる。
http://www.city.takayama.lg.jp/shimin/shimin_jinkousetai.html からリンクはあるのだが全部取ってくるのはだるいので python で取ってくる。

xlrd を使って落としてきた xls ファイルを csv 形式に変換

形式を確認するとすべて下の画像のようになっている。各年で変わってないのでいいですね。特徴をまとめておく。

  • A4-A15 に月が入っている
  • B4-B15 に男性人口が、C4-C15 に女性人口が入っている
  • E4-E15 に世帯数が入っている

ということで year(年度にしない), month, male_pop, femail_pop, households という形式の csv ファイルを作ればいいかな。
というわけスクリプト作成。

このスクリプト

$ python tkym_stat.py ./hoge > output.csv

とすることで ./hoge フォルダに xls ファイルを入れてカレントに csv ファイルを出力できた。あとは matplotlib とかで描画するだけ…なんだけど ブログネタを確保するため ちと長いから一旦ここで切ります。

参考にしたサイト

Python Excel
http://www.python-excel.org/

本家サイト。ここにあるテュートリアルの pdf、詳しいですね。

Excel操作 (python-excel) - Python入門から応用までの学習サイト
http://www.python-izm.com/contents/external/excel.shtml

xlrd と xlwt について日本語で書いてあるサイト。大体はここに載ってるので非常に楽。

*1:気象庁のページ 気象庁|過去の気象データ・ダウンロード からデータを拾って簡単な分析とかもいつかやりたいな。こっちは「きれいな」データなので非常に扱い易いけど。

*2:もちろん .xls であるのが一概にアカンと言っているわけではありません。こういった問題に興味がある方は「ネ申 Excel」(読み方:ねもうすえくせる)でググるといいと思います。あー、自分にも当てはまることがあって辛いですね…。

*3:実際は形式が多様+「ネ申」要素があったりするで人力で整形し直す必要がありそうですね…。

*4:注意 xlwt3 の pypi サイト では "Please use: https://pypi.python.org/pypi/xlwt-future/0.8.0 xlwt3 will be REMOVED from PyPI." と公言されている。なのでできることなら xlwt-future を使って下さい。ただやはり xlwt-future は 3.2 環境でのインストールはエラー吐いたので仕方なく xlwt3 を入れました。