画像提供:マイナビニュース

写真拡大

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