住所と郵便番号検索が可能な対話式コンソールアプリケーション

# はじめに
AdventCalendar初投稿です。
python枠が空いていたので、僭越ながら１件投稿させていただきます。

前回の記事はこちら→[LINE Notify + Pythonで天気情報を取得する方法](https://qiita.com/S_eki/items/206ddb321768ad4e7544)

# 背景
早いもので今年も１２月。
１２月といえばクリスマスですが、年賀状を用意する時期でもありますね。

年賀状を出そうと思ったとき、住所はわかるけど郵便番号何だったっけ・・・？と思ってしまうこと、ありませんか？（逆もまた然り）

今だと、住所をgoogle検索すれば郵便番号が出てきますが、
ネット環境が無くても住所・郵便番号が検索できるツールがあればと思い、
pythonの習熟がてら簡単なコンソールアプリを作ってみました。

郵便番号から住所を検索する事例は結構ありますが、
住所から郵便番号を検索する事例はあまりないと思ったので、どちらの場合でも対応できるようにしてみました。

# 環境
・Mac OS Mojave
・python3
・pyinstaller

# 処理仕様
フローチャートは下記の通りです。
基本的には、入力した郵便番号の住所をダンプするか
入力した住所（一部地名だけでも可）に対応する郵便番号をダンプするかをユーザに対話式で選んでもらう形式にしています。

![FindAddress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197189/dd5e10d1-9500-f63a-64de-dac2cf774a47.png)


#ソースコード
郵便局のWebページから郵便番号データダウンロードページから"KEN_ALL.CSV"をダウンロードしておき、それを/Users/直下に置いて読み込むようにしています。

https://www.post.japanpost.jp/zipcode/download.html

```FindAddress_for_Mac.py
import sys

# Set Path including "KEN_ALL.CSV" for Mac OS X
csv_path = "/Users/KEN_ALL.CSV"

def GetAddress():
    postal_code = input("Type target postal code:")
    fp = open(csv_path, "r", encoding="shift_jis")
    for line in fp:
        line = line.replace(' ', '') # cut space
        line = line.replace('"', '') # cut double quatation
        cells = line.split(",")      # split by comma
        code = cells[2]  # Postal code
        pref = cells[6]  # Prefucture
        city = cells[7]  # City name
        ad = cells[8]    # Address name
        title = pref + city + ad
        if code.find(postal_code) != -1:
            print(title)
    fp.close()

def GetPostalCode():
    addr = input("Type target address:")
    fp = open(csv_path, "r", encoding="shift_jis")
    for line in fp:
        line = line.replace(' ', '') # cut space
        line = line.replace('"', '') # cut double quatation
        cells = line.split(",")      # split by comma
        code = cells[2]  # Postal Code
        pref = cells[6]  # Prefucture
        city = cells[7]  # City name
        ad = cells[8]    # Address name
        title = pref + city + ad
        if title.find(addr) != -1:
            print(code + ":" + title)
    fp.close()


def main():
    print("\n")
    print("####################################################")
    print("################### FINDADDRESS ####################")
    print("####################################################")
    print("\n")
    print("[DISCRIPTION]")
    print(" This tool is to get address or postal code.")
    print(" If you type '1', you can get unknown address by typing postal code.")
    print(" If you type '2', you can get unknown postal code by typing KEYWORD about address name.")
    print("\n")

    while True:
        print("[OPERATION]")
        print("input the following number which you want to get.")
        number = input("[1:Address  2:PostalCode  99 (or SPACE):Close]:")
        if number.isdigit() != 1: # Filter non-integer value
            sys.exit()
        int_number = int(number)  # Convert String to Integer
        if int_number == 1:       # The case that user types "1"
            GetAddress()
            print("\n")
        elif int_number == 2:     # The case that user types "2"
            GetPostalCode()
            print("\n")
        elif int_number == 99:    # The case that user types "99"
            sys.exit()
        else:                     # Exception handling
            print("Invalid Number. Type again.")
            print("\n")

if __name__ == "__main__":
    main()

```
# pyinstallerでexe化
exe化の手順はこちらの記事がわかりやすいので参照。

PyInstallerでexeファイル化
https://qiita.com/takanorimutoh/items/53bf44d6d5b37190e7d1


# 実行結果
例として、東京都江東区の新木場の住所・郵便番号を検索してみます。

１の住所検索で郵便番号"1360082"を入力すれば、新木場の住所
"東京都江東区新木場"がダンプされます。
2の郵便番号検索で住所のキーワード"新木場"を入力すれば、新木場の文字が入っている住所すべての郵便番号と住所がセットでダンプされます。

<img width="650" alt="スクリーンショット 2019-12-05 0.42.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197189/ba4fd6ad-db08-6961-a144-4327ef595bda.png">


#注意点
使用前にターミナルの環境設定でシェルの終了時の設定を「ウィンドウを閉じる」に設定するようにしてください。これをやらないとアプリ終了後にコンソールが残ります。

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197189/96b44c3d-34a4-9e3d-333f-b21ac2ffbd8c.png)

#最後に
今後、時間があれば、Windows, Linux対応版の実装もしてみます。