郵便番号の入力を得て、都道府県から字名を出力するsomethingを作りました。
ネットショッピングをする際、住所の欄で郵便番号を入力すると字名まで入力補完してくれるシステムがありますが、それがどのように動いているのか気になったので書いてみました。
使用したDBや言語は既存のものと異なりますが、似た動作をしたらOKとします。
使用したもの
・ Terminal
・ python 3.6.1
・ pandas 0.24.2
・ sqlite3 2.6.0 (モジュールのバージョン)
・ SQLite3 3.24.0 (SQLite3のバージョン)
注意
Terminalからpythonを実行していたり、SQLite3を実行していたり、pythonのファイルを書いていたりしているので何を使って実行をしているか間違えないように気をつけてください。
完成までの手順
Step 0. CSVファイルをダウンロードする。
Step 1. CSVを整える。
Step 2. データベースを作る。
Step 3. pythonでテーブルからデータを取得する。
完成!
作ってみよう
Step 0. CSVファイルをダウンロードする。
リンクから全国一括のものをダウンロードしてください。
ダウンロードしたCSVの文字コードがShift-JISとなっているのでUTF-8に変換してください。
.read_csvの時点でエンコーディングをしても構いません。
Step 1. CSVを整える。
カラム名の追加と不要な列の削除をします。
カラムは郵便番号と漢字の都道府県,市区町村,字名のみを使用します。
インタプリタを使用したパターンと
*私の開発環境ではpyenvを使用しているのでpythonで3系が起動されますが、pyenvを使用してない方はpython3でインタプリタを起動してください。
Terminalからインタプリタを使うやり方
$ python
>>> import pandas as pd
>>> df = pd.read_csv('KEN_ALL.CSV', header=None)
>>> df = df.drop([0,1,3,4,5,9,10,11,12,13,14],axis=1)
>>> df.columns = ['郵便番号','都道府県','市区町村','字名']
>>> df.to_csv('output.csv')
>>> quit()
pythonファイルを書くやり方
最後にpythonファイルを実行してください。
import pandas as pd
df = pd.read_csv('KEN_ALL.CSV', header=None)
df = df.drop([0,1,3,4,5,9,10,11,12,13,14],axis=1)
df.columns = ['郵便番号','都道府県','市区町村','字名']
df.to_csv('output.csv')
Step 2. データベースを作る。
CSVをテーブルにインポートしてデータベース化します。
$ sqlite3 postal_code.sqlite3
sqlite> .mode csv
sqlite> .import output.csv postal_code
sqlite> SELECT * FROM postal_code; -- インポートされたかの確認ができます。
sqlite> .exit
Step 3. pythonでテーブルからデータを取得する。
作成したテーブルをpythonから検索して、マッチしたデータを取得します。
input()で郵便番号の入力を受け、データベースに検索をかけ、結果を表示します。
import sqlite3
print('\n郵便番号から住所を検索します。')
while True:
flag = 0
postal_code = input('郵便番号を入力してください。 *ハイフン不要 -> ')
while True:
ask = input('{}でよろしいですか? y or n -> '.format(postal_code))
if ask == 'y':
flag = 1
break
elif ask == 'n':
break
if flag == 1:
break
conn = sqlite3.connect('postal_code.sqlite3')
c = conn.cursor()
c.execute('SELECT * FROM postal_code WHERE 郵便番号={}'.format(postal_code))
re = c.fetchone()
conn.close()
if re == None:
print('\n入力された郵便番号はデータベースに存在しません。\n')
else:
print('''\n郵便番号とデータベースがマッチしました。
----------------------------------------
都道府県:{}
市区町村:{}
字名:{}
----------------------------------------\n'''.format(re[2],re[3],re[4]))
完成
terminalからpostal_code_completion.pyを実行してみてください。
$ python postal_code_completion.py
ハイフン無しで郵便番号を入力すると、データベースを参照して字名までの住所が表示されます。
郵便番号によっては、「以下に掲載がない場合」と表示されるのでその場合の条件分岐を実装してもいいと思います。
感想
今回は既存のシステムに似たものを書きましたが、車輪の再発明は開発面では無駄とは言え、学ぶ面においてはとても大事だと思っています。
身の回りにあるものの実装にチャレンジしてみるのも楽しいなと思いました。