先日、「KEN_ALL.CSVがUTF-8になった!」という衝撃的なニュースが飛び込んできた。それだけを聞くと何の事なのか分からないと思うが、郵便局が配布する郵便番号データ(ファイル名がKEN_ALL.CSVだった)がUTF-8形式でダウンロードできるようになったのだ。そこで、今回は、郵便局が提供しているCSVデータを活用して郵便番号検索ツールを作ってみよう。

  • 郵便番号データCSVがUTF-8で配布されるようになったので検索ツールを作ってみよう

    郵便番号データCSVがUTF-8で配布されるようになったので検索ツールを作ってみよう

郵便番号CSVについて

素晴らしいことに、郵便番号と住所の対応データは、かなり昔からCSV形式でダウンロードできるようになっていた。この郵便番号データは、オープンデータの先駆けと言っても良いだろう。筆者も以前から業務でこのCSVファイルを利用して、住所入力ツールや郵便番号の検索ツールを作った。単に郵便番号が分かるというだけでなく、日本中の市町村が網羅された信頼できるデータであり、市町村データの活用という意味でも、大きな意義のあるデータである。

マシンスペックが低かった頃から配布されているため、従来のダウンロードページでは、敢えて都道府県別にデータを分けて配布している。また「全国一括のデータは12万件あるため、一般的な表計算ソフト等では全データを読み込むことができない場合があります。」という注意書きも記されている。

  • 従来の郵便番号データの配布サイト

    従来の郵便番号データの配布サイト

新しい郵便番号データは何が違う?

そんな郵便番号データであるが、歴史的な経緯により、文字エンコーディングがShift_JISで記述されたデータがZIP形式で配布されていた。今回の郵便番号データの改善によって、これがUTF-8で配布されるようになった。

UTF-8形式での配布をサポートするようになったのには大きな意義がある。例えば、WebページやJSONデータ、各種データベースの主要なデータのデフォルトエンコーディングは、UTF-8となっている。そのため、郵便番号データを扱う際は、Shift_JISをUTF-8に変換して使うことが多くなった。それほど面倒ではないものの、最初からUTF-8であれば変換の手間が不要になる。

ちなみに、郵便番号を扱うツールを開発した多くのプログラマーが心配していたことだが、従来形式のデータも引き続きダウンロードできるようになっている。これは、多くの業務ツールが、最新の郵便番号CSVを自動ダウンロードして利用する仕組みになっていることを考慮してのことだろう。

なお、従来のKEN_ALL.CSVから変更された点をまとめると次のようになる。
・文字エンコーディングがShift_JISからUTF-8になった
・半角カナを廃止し、全角カナを採用した
・町域名が長い場合、複数レコードに分かれていたが1レコードで記述するようにした
・データファイル名が「utf_all.csv」になった
・従来のKEN_ALL.CSV形式も継続して配布する

UTF-8形式の注意点

現在、CSVを閲覧したり編集したりする主要なツールと言えば、Excelだ。しかし。UTF-8で記述されたCSVデータをそのまま読むことはできない。原稿執筆時点の最新のWindows版2307(macOS版16.76)で試したが、UTF-8で記述されたCSVをダブルクリックして(ファイルの関連づけを利用して)Excelで開くと文字化けしてしまう。

  • UTF-8形式のCSVファイルを読むと文字化けしてしまうので注意

    UTF-8形式のCSVファイルを読むと文字化けしてしまうので注意

正しくUTF-8形式のCSV読み込むためには、画面上部のメニューから[データ > データの取得 > ファイルから > テキストまたはCSVから]をクリックします。そして「utf_all.csv」を選択します。読み込みのプレビューが表示されるので問題なければ、そのまま「読み込み」ボタンをクリックすると、正しくUTF-8形式のCSVをExcelで開くことができます。

  • CSVファイルを正しくExcelで読んだところ

    CSVファイルを正しくExcelで読んだところ

もちろん、Excelで手軽に読むために、敢えてテキストエディタなどを利用して開き、Shift_JISに変換して保存すれば、これまで通りExcelでダブルクリックして開くことができる。

郵便番号データ(UTF-8形式)のダウンロード

早速、こちら からUTF-8形式の郵便番号データをダウンロードしよう。ダウンロードサイズは、ZIP形式で1.94MBだ。

  • 郵便番号データのダウンロード

    郵便番号データのダウンロード

ダウンロードZIPファイルを解凍すると、「utf_all.csv」というCSVファイルが出てくる。これが、UTF-8形式の郵便番号データだ。前述の通り、より扱い易いCSVデータとなっているため、今後は、このUTF-8形式のCSVを使うことになるだろう。

Pythonで郵便番号を検索

それでは、簡単なPythonのプログラムを使って任意の郵便番号から住所を調べるプログラムを作ってみよう。

以下のように、プログラムの(*1)に郵便番号を調べたい住所を指定しよう。「都道府県」を変数prefに「市区」を変数cityに、「町村」を変数townに指定して、「search_zipcode.py」という名前で保存しよう。

import csv

# 検索したい住所を指定 --- (*1)
pref = '東京都'
city = '千代田区'
town = '神田'

# ファイルを開く --- (*2)
with open('utf_all.csv', encoding='utf-8') as fp:
    reader = csv.reader(fp)
    # 住所を検索する --- (*3)
    for row in reader:
        # CSVから意味のあるカラムを取り出す --- (*4)
        r_zip = row[2]
        r_pref, r_city, r_town = row[6], row[7], row[8]
        # 検索に合致した行を表示 --- (*5)
        if r_pref == pref and r_city == city and town in r_town:
            print(r_zip, r_pref, r_city, r_town)
    print('終了')

そして、コマンドラインからプログラムを実行しよう。ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、以下のコマンドを実行しよう。

# Windowsの場合
python search_zipcode.py

# macOSの場合
python3 search_zipcode.py

すると、次のように表示される。ここでは敢えて複数の候補が想定される千代田区の「神田」を検索してみた。すると、郵便番号と住所の一覧が表示される。

  • 住所から郵便番号を検索したところ

    住所から郵便番号を検索したところ

プログラムを確認してみよう。プログラムの(*1)では検索したい住所を指定した。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら