【プログラミング】Free#1 -Python CSVの取得からDictへの格納まで-
どうもこんにちは、Tearlです。
今回から、プログラミングについて書きたいことをまとめるFreeというnoteを始めていきます。
他のプログラミング関係のnoteとは違い「説明を付けて書こう!」など意識していませんので、箇条書きかもしれませんがご了承ください。
他人がみても大丈夫な程度に加工したメモのようなnoteとなります。
今回は趣味で最近よく使っているPythonによるCSV加工の中でも取得~Dictへの格納までについてまとめていきます。
1. CSVを取得するためのプログラム作成
適当な場所で.pyを作成 (ファイル名 : test_py.py)
1-1. 必要なライブラリのインポート
CSVをローカル環境から取得する際に必要な os と データ格納の際に便利なcopy をインポートする
以下、本時点でのコード
# import
import os, copy
1-2. テスト実行をする上で便利なmain()の作成
mian関数があればテストをするとき、このファイルだけで実行するときに便利なので、作成。
とりあえず正しく作成できているか確認するためにmain()に print('a') を書き、実行→確認
以下本時点でのコード、実行すると a が表示される
# import
import os, copy
# main
def main():
print('a')
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
1-3. 適当なファイルを取得してみる(CSVを取得する)
以下のようなCSVを作成しておく (ファイル名 : test_csv.csv)
ID,strs,ints
1,test1,11
2,test2,12
3,test3,13
4,test4,14
5,test5,15
実行ファイルのパスを出力するコードを作成する
以下本時点でのコードを実行すると、この実行ファイルの絶対パスが出力される
# import
import os, copy
# main
def main():
#このファイルのパスを取得する(絶対パス)
this_file_path = os.path.dirname(__file__)
print(this_file_path)
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
実行ファイルから加工したいCSVまでのpathを作成して取得する
以下を実行すると取得したいファイルのパスが生成できる
# import
import os, copy
# main
def main():
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
実際にread(読み込み)でファイルを取得
以下を実行するとどのようなファイルを読み込んだかの結果が出る
# import
import os, copy
# main
def main():
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
print(csv_file_read)
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
2. ファイルの中身を読み取る
2-1 . 1行目を読み取る
まず、読み取りファイルの1行目を読み取る
以下を実行すると、1行目(本note内だと ID,strs,ints) が出力される
# import
import os, copy
# main
def main():
# --- 1. CSVを取得するためのプログラム作成 ---
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# --- 2. ファイルの中身を読み取る ---
# 取得ファイルの1つめの行を読み取る
one_line = csv_file_read.readline()
print(one_line)
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
2-2. 全ての行を読み込む
今回は行数が判明しているが、わからない場合のほうが多いかつ使い勝手がよいためそちらで作成
while True とすることで無限ループを作り、新しい行が読み込めなければbreakで処理を抜けるようにすることで、行数不明のファイルを読み込む
以下を実行すると、全ての行が出力される
# import
import os, copy
# main
def main():
# --- 1. CSVを取得するためのプログラム作成 ---
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# --- 2. ファイルの中身を読み取る ---
# Trueの間処理を行う = 無限ループする
while True:
# 取得ファイルのn行を読み取る
one_line = csv_file_read.readline()
# ラインが存在したら処理を行う
if one_line:
print(one_line)
# ラインが存在しなければ処理を抜ける
else:
break
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
3. Dictに格納する
1.で取得したデータをDictに格納する
配列を選ばなかった理由としては、配列のindexによる検索よりも、CSVの項目名で検索できる状態にした方が、使い勝手が良いと思っているため
3-1. 1行をCSVの各列に分ける
CSV (comma separated values) という名の通り、「,」によって区切られたデータなので、「,」で区切っていく
以下を実行すると1行が「,」ごとに区切られて配列に格納されているものが出力される
# import
import os, copy
# main
def main():
# --- 1. CSVを取得するためのプログラム作成 ---
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# --- 2. ファイルの中身を読み取る ---
# Trueの間処理を行う = 無限ループする
while True:
# 取得ファイルのn行を読み取る
one_line = csv_file_read.readline()
# 文字列の最後に(utf_8の)改行コードが含まれている場合に削除するためのコード
one_line = one_line.rstrip("\n")
# ラインが存在したら処理を行う
if one_line:
# --- 3. 配列に格納する ---
# splitで「,」ごとに区切る
one_line_split = one_line.split(',')
print(one_line_split)
# ラインが存在しなければ処理を抜ける
else:
break
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
3-1. 項目名を使ってDictを作成する
CSV1行目の段階でDictの要素を作成する
以下を実行すると、要素名をkeyにもつ配列が確認できます
# import
import os, copy
# main
def main():
# --- 1. CSVを取得するためのプログラム作成 ---
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# --- 2. ファイルの中身を読み取る ---
# Trueの間処理を行う = 無限ループする
first_line = True
datas = {}
# 後に要素をDictに格納するためのkey名を格納する配列
keys = []
while True:
# 取得ファイルのn行を読み取る
one_line = csv_file_read.readline()
# 文字列の最後に(utf_8の)改行コードが含まれている場合に削除するためのコード
one_line = one_line.rstrip("\n")
# ラインが存在したら処理を行う
if one_line:
# --- 3. 配列に格納する ---
# splitで「,」ごとに区切る
one_line_split = one_line.split(',')
if first_line:
# Dictのキーとして1行目を使用する
for splits in one_line_split:
# 作成していたDictに1行目の1要素をkeyとしてもつ配列を作成する
datas[f'{splits}'] = []
# Dictに格納する時にkey名を指定するために配列に要素を格納する
keys.append(f'{splits}')
first_line = False
print(datas)
print(keys)
# ラインが存在しなければ処理を抜ける
else:
break
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
3-2. Dictの中に各要素を格納していく
先ほどの keys を使って各要素を格納していく
以下を実行するとDictの各要素内にデータが入っていることが確認できる
# import
import os, copy
# main
def main():
# --- 1. CSVを取得するためのプログラム作成 ---
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# --- 2. ファイルの中身を読み取る ---
# Trueの間処理を行う = 無限ループする
first_line = True
datas = {}
# 後に要素をDictに格納するためのkey名を格納する配列
keys = []
while True:
# 取得ファイルのn行を読み取る
one_line = csv_file_read.readline()
# 文字列の最後に(utf_8の)改行コードが含まれている場合に削除するためのコード
one_line = one_line.rstrip("\n")
# ラインが存在したら処理を行う
if one_line:
# --- 3. 配列に格納する ---
# splitで「,」ごとに区切る
one_line_split = one_line.split(',')
if first_line:
# Dictのキーとして1行目を使用する
for splits in one_line_split:
# 作成していたDictに1行目の1要素をkeyとしてもつ配列を作成する
datas[f'{splits}'] = []
# Dictに格納する時にkey名を指定するために配列に要素を格納する
keys.append(f'{splits}')
first_line = False
else:
# 1行内に作成された要素数は全て同じ数になっているはずなので、zipで同時に要素を取り出し格納する
for key_str, splits in zip(keys, one_line_split):
datas[key_str].append(splits)
# ラインが存在しなければ処理を抜ける
else:
break
print(datas)
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
最終的にできたコード
printなど確認に使用していたコードを削除したものが以下になります
# import
import os, copy
# main
def main():
# 加工したいCSVまでのパス(実行ファイルからのパス)
csv_file = 'test_csv.csv'
# このファイルのパスを取得する(絶対パス)
csv_path = os.path.join(os.path.dirname(__file__), csv_file)
# ファイルの取得(読み込み用)
csv_file_read = open(csv_path,'r',encoding="utf_8")
# Trueの間処理を行う = 無限ループする
first_line = True
datas = {}
# 後に要素をDictに格納するためのkey名を格納する配列
keys = []
while True:
# 取得ファイルのn行を読み取る
one_line = csv_file_read.readline()
# 文字列の最後に(utf_8の)改行コードが含まれている場合に削除するためのコード
one_line = one_line.rstrip("\n")
# ラインが存在したら処理を行う
if one_line:
# splitで「,」ごとに区切る
one_line_split = one_line.split(',')
if first_line:
# Dictのキーとして1行目を使用する
for splits in one_line_split:
# 作成していたDictに1行目の1要素をkeyとしてもつ配列を作成する
datas[f'{splits}'] = []
# Dictに格納する時にkey名を指定するために配列に要素を格納する
keys.append(f'{splits}')
first_line = False
else:
# 1行内に作成された要素数は全て同じ数になっているはずなので、zipで同時に要素を取り出し格納する
for key_str, splits in zip(keys, one_line_split):
datas[key_str].append(splits)
# ラインが存在しなければ処理を抜ける
else:
break
# コードを実行しているファイルとmainが書かれたファイルが同じ場合実行する
if __name__ == '__main__':
main()
ご覧いただきありがとうございました
この記事が気に入ったらサポートをしてみませんか?