2020年10月25日日曜日

Pythonで郵便番号から住所を検索する

 Pythonで郵便番号から住所を検索する方法をまとめておく。インターネットが使えれば日本郵便のウェブサイト郵便番号検索で検索できるので、ここでまとめておくのはローカルで検索する方法。


環境


WSL(Ubuntu18.04)。



郵便番号データ

郵便番号と対応する住所のデータは日本郵便のウェブサイト郵便番号データダウンロードからダウンロードできる。いくつか種類があるが、ここでは読み仮名データの促音・拗音を小書きで表記するもの(zip形式)の全国一括をダウンロードする。

ダウンロードしたファイルken_all.zipはcsvをzip圧縮したもの。csvの中身については郵便番号データの説明を参照。郵便番号と都道府県名、市区町村名、町域名などの情報が含まれる。


郵便番号から住所を検索する

ダウンロードしたファイルを使って、郵便番号から住所を検索してみる。ダウンロードしたファイルをPandasで読み込んで、郵便番号に対応した住所を表示するスクリプトを作成。

import sys
import pandas as pd

def main():
    if len(sys.argv) == 1:
        print('Python3 {} [zip code]'.format(sys.argv[0]))
        sys.exit()

    assert len(sys.argv[1]) == 7 and sys.argv[1].isdecimal(), 'Invalid argument: {}'.format(sys.argv[1])
    zip_code = sys.argv[1]

    # zip圧縮されたcsvを読み込む
    csvfile = 'ken_all.zip'
    df = pd.read_csv(csvfile, compression='zip', header=None, quotechar='"', dtype=object, encoding='shift_jis')

    # 郵便番号をインデックスにする
    df.set_index(df.columns[2], inplace=True)

    if zip_code in df.index:
        print(df.loc[[zip_code], [df.columns[5], df.columns[6], df.columns[7]]]
            .to_string(index=False, header=False))
        print(df.loc[[zip_code], [df.columns[2], df.columns[3], df.columns[4]]]
            .to_string(index=False, header=False))
    else:
        print('Invalid zip code:', zip_code)

if __name__ == '__main__':
    main()

ダウンロードしたファイルken_all.zipを作成したスクリプトファイルと同じ場所に置いて、次のように郵便番号を引数としてわたすと住所が表示される。


1 件のコメント:

  1. ありがとうございます!!困ってました!解決しました!!

    返信削除