旬のトピック、最新ニュースのマピオンニュース。地図の確認も。

ゼロからはじめるPython 第107回 郵便番号CSVがUTF-8になったので改めて郵便番号検索ツールを作ってみよう

2023年09月11日16時52分 / 提供:マイナビニュース

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

○郵便番号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読み込むためには、画面上部のメニューから[データ > データの取得 > ファイルから > テキストまたはCSVから]をクリックします。そして「utf_all.csv」を選択します。読み込みのプレビューが表示されるので問題なければ、そのまま「読み込み」ボタンをクリックすると、正しくUTF-8形式の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)では検索したい住所を指定した。

(*2)では、ファイルを開く処理を記述している。なお、utf_all.csvの文字エンコーディングであるUTF-8をencoding引数で指定する必要があるので注意しよう。

(*3)以降の部分ではfor文を利用して1行ずつしらみつぶしに住所検索を行う。

(*4)ではCSVから意味のあるカラムを取り出している。なお、郵便番号が0から数えて2つ目(つまり3列目)、都道府県が0から数えて6つめ(7列目)のように並んでいるので、カラムのインデックスを指定してデータを取り出す。

そして、(*5)で検索に合致した行があればprintを利用して出力する。

なお、上記で紹介したプログラムでは、一つの郵便番号に複数の町名がまとまっている場合に、うまく検索できない場合がある。そのため、町名が見当たらない場合には、町名に「以下に掲載がない場合」と指定する必要がある。
○まとめ

以上、今回は、主にUTF-8に対応した郵便番号データと、それをPythonで活用する方法について簡単に紹介した。なお、本連載の11回目と68回目でも郵便番号データを題材にしているので参考になるだろう。

余談だが、以前、海外の地方都市で暮らした際、かなり大きな都市であるにも関わらず、郵便番号が市内全部同じということを知って衝撃を受けたことがある。これでは郵便事情が悪いのも理仕方ないと思ったものだ。

日本では大抵の町に異なる郵便番号が割り振られ、定期的に郵便番号データがメンテナンスされており、その面だけ見ても優秀だ。そして、せっかくオープンデータとして公開されている郵便番号データなので、プログラムに組み込んで活用したい。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「実践力をアップする Pythonによるアルゴリズムの教科書(マイナビ出版)」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。

続きを読む ]

このエントリーをはてなブックマークに追加

関連記事

ネタ・コラムカテゴリのその他の記事

地図を探す

今すぐ地図を見る

地図サービス

コンテンツ

電話帳

マピオンニュース ページ上部へ戻る