- 本記事にはアフィリエイト広告が含まれます -
こんにちは、キクです。
本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
今回はPythonを用いて『都道府県データが格納されたCSVファイルを操作するプログラム』を自作してみたので、その記録を残しておこうと思います。
それでは、よろしくお願いします。
背景
Pythonの学習を進める中で、珍しく「こんなプログラムを書いてみようかな」と思い付いたものがありました。
それが今回の題材である「都道府県データの操作」というものでした。
今回は対話形式で取得したい情報を得られるようなイメージだったので、input( )を複数回利用する形で構成してみました。
都道府県データを操作するプログラムを書いてみた
使用するデータ
ファイル名:todohuken.csv
都道府県コード,地域区分,都道府県名
1,北海道,北海道
2,東北,青森県
3,東北,岩手県
4,東北,宮城県
5,東北,秋田県
~ 中略 ~
43,九州・沖縄,熊本県
44,九州・沖縄,大分県
45,九州・沖縄,宮崎県
46,九州・沖縄,鹿児島県
47,九州・沖縄,沖縄県
今回書いたコード
# csvファイルから取得する全情報を格納するリスト
all_list = []
# 地域区分に関するリスト
tiku_list = ["北海道", "東北", "関東", "中部", "近畿", "中国", "四国", "九州・沖縄"]
# csvファイルから取得する都道府県名に関するリスト
tdhk_list = []
# csvファイルから必要情報を取得
with open("input/todohuken.csv", encoding="utf-8") as f:
f.readline()
for row in f:
columns = row.rstrip().split(",")
tdhk_code = columns[0]
tiku_name = columns[1]
tdhk_name = columns[2]
all_list.append((tdhk_code, tiku_name, tdhk_name))
tdhk_list.append(tdhk_name)
# 指定した地域区分に一致する都道府県名を表示する関数を定義
def tdhk_from_tiku(all_list, arg_tn):
for row in all_list:
def_tiku_name = row[1]
def_tdhk_name = row[2]
if def_tiku_name == arg_tn:
print(f".{def_tdhk_name}")
# [Q1]最初の質問
print("""
◆◆◆ 何が知りたいですか?(番号で回答してください) ◆◆◆
1. 全情報取得
2. 指定した地域区分の都道府県名を取得
3. 指定した都道府県名の地域区分を取得""")
print()
# 上記質問に対する回答番号を取得
input_num = input("回答番号:")
print()
# 回答番号が「1」ならば全情報を表示して終了
# 回答番号が「2」ならば次の質問に遷移
# 回答番号が「3」ならば次の処理依頼に遷移
if input_num == "1":
for row in all_list:
print(f"コード:{row[0]} / 地域区分:{row[1]} / 都道府県名:{row[2]}")
elif input_num == "2":
# [Q2]最初の回答番号で「2」と答えた人向けの追加質問
print("◆◆◆ どの地域区分の情報が知りたいですか?(番号で回答してください)◆◆◆ ")
print("1. 北海道\\n2. 東北\\n3. 関東\\n4. 中部\\n5. 近畿\\n6. 中国\\n7. 四国\\n8. 九州・沖縄")
print()
# 該当する地域区分の番号を取得
tiku_num = int(input("回答番号:"))
print()
# 関数「tdhk_from_tiku」を利用して、指定された地域区分に属する都道府県名を表示
print(f"結果: 地域区分が「{tiku_list[tiku_num - 1]}」の都道府県は以下になります。")
tdhk_from_tiku(all_list, tiku_list[tiku_num - 1])
elif input_num == "3":
# [Q2]最初の回答番号で「3」と答えた人向けの処理
print("◆◆◆ 都道府県名を入力してください。(入力例:沖縄県) ◆◆◆ ")
tdhk_name = input("都道府県名:")
for row in all_list:
# 指定された都道府県名と取得した行のインデックス2の情報(都道府県名)が一致する場合には地域区分を表示
if row[2] == tdhk_name:
print(f"結果: {tdhk_name}の地域区分は「{row[1]}」です")
break
# 指定された都道府県名がリスト「tdhk_list」には含まれているが取得した行のインデックス2の情報(都道府県名)と一致しない場合には何もしない
elif (tdhk_name in tdhk_list) and (not row[2] == tdhk_name):
pass
# それ以外(リストには存在しない = 回答として適切でない書式)の場合には処理を終了
else:
print("結果: 書式が正しくありません。\\n最初からやり直してください。")
break
動作確認
[Q1]最初の質問
■Q1で回答1を選択した場合
全都道府県リストが表示される
■Q1で回答2を選択した場合
[Q2]次の質問として情報を取得したい地域区分番号の入力を促される
■Q2で回答4を選択した場合
指定した地域区分の都道府県リストが表示される
■Q1で回答3を選択した場合
[Q2]次の質問として情報を取得したい都道府県名の入力を促される
■Q2で「東京都」と回答した場合
東京都が属する地域区分「関東」が返される
■Q2で想定と異なる回答をした場合
書式が正しくないことを指摘される
今回できなかったこと
- tiku_listをcsvから取得したデータで整形して、それ以降のコードで活用すること
- 書式が正しくない場合に再度都道府県名を入力させるようにすること