経営工学徒の備忘録

~日々の大学生活や留学について~

郵便番号と緯度経度の一覧データを取得する【Python】

日本郵便からは、郵便番号の一覧データをダウンロードすることができます。
www.post.japanpost.jp
また、国土交通省からは、全国の市町村と緯度経度のデータをダウンロードすることができます。
nlftp.mlit.go.jp

しかしながら、郵便番号と緯度経度が紐づけされた一覧データはダウンロードすることができません。
今回は、以下の記事やAPIをもとに、郵便番号と緯度経度の一覧データを取得してみます。
qiita.com
geoapi.heartrails.com

早速、Pythonでのコードを載せます。

import requests
import json
import pandas as pd
import csv

name =["code","zip5","zip7","yomi1","yomi2","yomi3","name1","name2","name3","other1","other2","other3","other4","other5","reason"]
zipcode = pd.read_csv('./KEN_ALL.CSV', names=name, encoding='cp932', header = None)

url = 'http://geoapi.heartrails.com/api/json'
payload = {'method':'searchByPostal'}

for i in range(len(zipcode)):
    try:
        payload['postal']= (str(zipcode["zip7"][i]).zfill(7))
        res = requests.get(url, params=payload).json()['response']['location'][0]
        with open('./KEN_ALL_POSTALCODE.csv', 'a',newline='') as f:
            writer = csv.writer(f)
            writer.writerow([res['postal'], res['prefecture'], res['city'], res['town'], res['y'],res['x']])
            
    except:
        continue

簡単な説明としては、まずpandasでこちら(https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)にある全国一括の郵便番号データを読み込みます。この際に、nameでheaderに名前を付けてあげています。
その後、forループを回して、一つ一つの郵便番号を参照し、APIを動かし、取得した値をcsvファイルに書き込む、ということを繰り返しています。
たまに郵便番号を入れてもAPIが緯度経度を返せずエラーが起こってしまうため、try exceptでそのような場合は次のループに進むようにしています。
特に工夫もせず単純なループを回しただけのコードですので、実行には大体4時間程度かかりました。
もしご要望等あれば、完成したファイルの無料または有料での配布も考えておりますので、コメントいただければ幸いです。