本稿では、Pythonをゼロから学ぶヒントを紹介している。今回は、Pythonを使って、最も身近なオープンデータ「郵便番号データベース」を活用する方法を紹介する。
オープンデータとは?
近年「オープンデータ」が話題となっている。オープンデータとは、インターネットなどを通じて誰でも自由に入手し、利用・再配布できるデータの総称だ。政府、自治体、研究機関、企業などが公開することが多い。現在では、人口統計や、過去の天気や気温など、さまざまなデータがオープンデータとして公開されている。
郵便番号データベースを使ってみよう
そして、インターネットユーザーの間で、早くから様々な形で利用されてきたオープンデータとして思い浮かぶのが「郵便番号データベース」だ。以下、郵便局のWebサイトから、誰でも郵便番号データをダウンロードできる。
郵便番号データ ダウンロード
[URL] http://www.post.japanpost.jp/zipcode/download.html
郵便番号データ ダウンロードのページ |
今回は、Pythonからオープンデータ活用の例として、住所から郵便番号を検索するツールを作ってみよう。上記のサイトから、「住所の郵便番号(CSV形式)」をダウンロードしてみよう。
データは、各都道府県ごとのデータと、全国一括の二種類があるので、ここでは「全国一括」のデータをダウンロードしよう。データは、ZIP形式で圧縮されているので、ZIPデータを解凍すると、「KEN_ALL.CSV」というCSVファイルが表示される。
CSVファイルは、Excelなどで手軽に見ることができる形式だ。とは言え、このCSVファイルは、非常にサイズが大きいので、筆者のMacbook AIRでは、ファイルを開くのに十秒かかった。もしも、古いPCだと、フリーズして開くことができないかもしれない。
※なお、CSVファイルに関しては、本連載の3回目で詳しく紹介しているので参考になると思う。
Pythonで郵便番号を検索するプログラムを作ろう
それでは、Pythonを使って、郵便番号を検索するプログラムを作ってみよう。検索すると言っても、難しい処理を作る必要は無い。CSVファイルを開いて、一行ごとに検索語句があるかどうかを調べるというプログラムだ。以下のようなプログラムになる。
findzip.py(findzip.lzh)
# 郵便番号検索
import sys
# コマンドライン引数を確認 --- (*1)
if len(sys.argv) <= 1:
print("以下のように入力してください")
print("python findzip.py (住所)")
sys.exit()
addr = sys.argv[1].strip()
# CSVファイルを開く --- (*2)
fp = open("KEN_ALL.CSV", "rt", encoding="shift_jis")
# 一行ずつ読んで住所の一致を調べる --- (*3)
for line in fp:
line = line.replace(' ', '')
line = line.replace('"', '')
cells = line.split(",")
zipno = cells[2] # 郵便番号
ken = cells[6] # 都道府県
shi = cells[7] # 市区
cho = cells[8] # 市区以下
title = ken + shi + cho
if title.find(addr) >= 0:
print(zipno + ":" + title)
fp.close()
このプログラムは、コマンドラインから実行する。WindowsならコマンドプロンプトやPowerShell、macOSならターミナルを起動して、以下のようなコマンドを実行しよう。
例えば、浅草の郵便番号を調べるなら、以下のように入力する。
# Windowsの場合
python findzip.py 浅草
# macOSの場合
python3 findzip.py 浅草
任意の住所を検索したい場合には、上記の「浅草」と書いている部分を「渋谷」など任意の住所に書き換えよう。プログラムを実行すると、任意の住所に合致するものが一覧で表示される。
プログラムを確認してみよう。プログラムの(*1)の部分では、コマンドライン引数を確認する。ターミナルで、「python プログラム名 ***」と実行すると、***に当たる部分を、コマンドライン引数と呼び、sys.argvを参照することで値を取得できる。
プログラムの(*2)の部分では、郵便番号のデータファイル「KEN_ALL.CSV」を一行ずつ読むために開く処理を記述している、第二引数の「rt」は、テキストモードでファイルを読むことを指定し、encodingはファイルの文字コードを指定する。
そして、(*3)の部分では、CSVファイルを一行ずつ読んで、住所データが記述されている部分を取り出し、コマンドライン引数で指定した住所と一致していれば、郵便番号および住所をprint()文で出力する。
まとめ
以上、今回は、コマンドラインから使える郵便番号の検索ツールを作ってみた。普段からコマンドラインに抵抗がない人であれば、手軽に郵便番号が検索できるので重宝するだろう。
とは言え、コマンドラインにそれほど慣れていない人と、扱いづらく感じるかもしれない。また、別の機会に、GUIやブラウザから使えるツールに仕上げてみたいと思う。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。