2020年11月1日日曜日

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

Pythonで郵便番号から住所を検索するでは郵便番号から住所を検索したが、実際には住所から郵便番号を検索することが多いと思う。そこで、今回はPythonで住所から郵便番号を検索してみる。今回もローカル環境で検索する方法。


環境


WSL(Ubuntu18.04)。


郵便番号データ

使用する郵便番号データはPythonで郵便番号から住所を検索すると同じ。


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

日本郵便のウェブサイトからダウンロードしたファイルを使って、住所から郵便番号を検索してみる。ダウンロードしたファイルをPandasで読み込んで、都道府県名、市町村区名、町域名それぞれに検索ワードを指定して一致する郵便番号を表示するスクリプトを作成。

import argparse
import pandas as pd

def parse_args():
    parser = argparse.ArgumentParser(description='郵便番号検索') 

    parser.add_argument('prefecture', help='都道府県名', type=str)
    parser.add_argument('municipality', help='市町村区名', type=str)
    parser.add_argument('area', help='町域', type=str)

    args = parser.parse_args()

    params = {}
    params['prefecture'] = args.prefecture
    params['municipality'] = args.municipality
    params['area'] = args.area

    return params

def main():
    params = parse_args()

    # 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)

    df_filtered = df[
        df[df.columns[5]].str.contains(params['prefecture'], regex=False) &
        df[df.columns[6]].str.contains(params['municipality'], regex=False) &
        df[df.columns[7]].str.contains(params['area'], regex=False)]

    if len(df_filtered.index) == 0:
        print('No zip code was found.')
    else:
        for zip_code, row in df_filtered.iterrows():
            print(zip_code + ' ' + ' '.join(row.tolist()[5:8]))

if __name__ == '__main__':
    main()

スクリプトの引数として都道府県名、市町村区名、町域名それぞれの検索ワードを指定すると、一致した郵便番号と住所が表示される。


0 件のコメント:

コメントを投稿