今回は、こんな発想の声に対応するガジェットです。 「複数の住所に書類を送ることがありました。送り先のリストには住所はあるのですが、郵便番号がありません。封筒を作成するときにさすがに郵便番号を書かないのはよくないなということで、それぞれ郵便番号をリストに追加することになりました。それで、ネット検索で一つずつ住所を打ち込み郵便番号をコピペするという作業を行いました。まあ、コピペコピペで全然できるのですが、あれ、これって一気にできない??できるんじゃない??」
たくさんの住所から郵便番号を一発で取得します
住所のみ与えられているリストを一括で取り込み、その住所の郵便番号を自動で調べリストに記載してcsvを吐き出すというガジェットです。
このガジェットでできることはこちら
- 郵便番号と住所をcsvデータとしてご提供されているAIBISU CorpさんのZip CloudというサイトからデータをDLさせていただいております。(日本郵便のWebサイトで公開されている郵便番号データ)
- 住所のみ載っているリストから郵便番号を一括で検索しリストに反映CSVで返すことができます。
- 大量のリストでも対応可能ですので、一つずつ検索するより圧倒的に時間短縮できます。
郵便番号データのダウンロード - zipcloud
注意点はこちら
- ファイル形式をcsvにしております。
- 住所によっては郵便局で町域の記載がないものがあり、その場合は「別途チェック」という言葉を返します。この場合手動で確認する必要あります。
- また、丁目で郵便番号が分かれる住所はそれぞれの番号が出るようにしています。こちらも手動で確認する必要があります。
評価(自己)
役立ち度 ★★★★(良し)
効率化 ★★★★(良し)
ミス防止 ★★★(平均)
楽しさ ★★★(平均)
操作性 ★★(悪い)
設定をcsvにしているので、エクセルの場合変換しないといけない点(コードを書き換えれば対応は可能) 住所によって手動を余儀なくされる住所がある点で操作性を悪いにしております。
実行環境
使用環境 csv
使用言語 python
使用ライブラリ pandas、re
今回のコード
検索の元ファイルの作成
import pandas as pd
names = ['番号', '上3桁', '郵便番号', '読み(都道府県名)', '読み(市区町村名)', '読み(町域名)', '都道府県名', '市区町村名', '町域名', '他1', '他2', '他3', '他4', '他5', '他6']
data = pd.read_csv('x-ken-all.csv', encoding='shift-jis', names=names)
data['郵便番号'] = data['郵便番号'].astype(str)
for i in range(len(data['郵便番号'])):
if len(data.loc[i, '郵便番号']) == 6:
data.loc[i, '郵便番号'] = '0' + data.loc[i, '郵便番号']
elif len(data.loc[i, '郵便番号']) == 5:
data.loc[i, '郵便番号'] = '00' + data.loc[i, '郵便番号']
data = data.fillna('(なし)')
data['住所'] = data['都道府県名'] + data['市区町村名'] + data['町域名']
data = data[['郵便番号', '住所', '他1', '他2', '他3', '他4', '他5', '他6']]
data.to_csv('base_data.csv')
郵便番号を反映させたリストを作成
import re
import pandas as pd
test_data = pd.read_csv('task.csv')
data = pd.read_csv('base_data.csv')
test_data['郵便番号1'] = 'なし'
test_data['郵便番号2'] = 'なし'
sepalate_data = []
for i in test_data['住所'].values:
sepalate_data.append(re.split('\d', i)[0])
test_data['町域まで'] = sepalate_data
test_data = test_data[['住所', '町域まで', '郵便番号1', '郵便番号2']]
for i in range(test_data.shape[0]):
address = test_data['町域まで'][i]
postcode = data[data['住所']==address]['郵便番号'].values
if len(postcode) == 0:
test_data['郵便番号1'][i] = '別途チェック'
elif len(postcode) == 1:
test_data['郵便番号1'][i] = postcode[0]
elif len(postcode) == 2:
test_data['郵便番号1'][i] = postcode[0]
test_data['郵便番号2'][i] = postcode[1]
test_data.to_csv('checked_data.csv', index=False)