本稿では、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だと、フリーズして開くことができないかもしれない。

KEN_ALL.CSVをExcelで開いてみたところ

※なお、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貢献者章受賞。技術書も多く執筆している。