CSVファイルの変換処理
from 2026-06-19
CSVファイルの変換処理
ワイド型csvファイルとは?
ふつうにカラムにid, name, grade, score, ......と要素を書いていくcsv
ロング型のフォーマットとは?
"type"というカラムに要素名を記述する
ワイド-> ロングの変換をmeltという
import osとは?
osはOSに依存する機能、ファイルの読み書きなど、を操作するのに便利なモジュール
os.path.join(a, b)
os.path.dirname(os.path.abspath(__file__))
__file__は現在実行されているscriptのpathを示すビルトイン変数(特殊変数?)
with open() as f:
ここに何か書くとfが終わると自動で閉じてくれる(f.close()と同等)
for line in f:
csvをfに入れると自動で行が取り出されるのはなぜ
claude.icon
挙動を決定しているのは、変数名ではなく、in の後ろに置かれているオブジェクトの種類です。for ... in range(10)のように書いた場合には、rangeオブジェクトがイテレータプロトコルを実装しており、その__next__メソッドが整数を1つずつ返す実装になっているため、取り出される値はintになります。一方、for ... in fのようにファイルオブジェクトを走査する場合には、ファイルオブジェクトの__next__メソッドが文字列(行データ)を返す実装になっているため、取り出される値はstrになります。
appendせずに'w' modeのみで書き込んでワイドからロングにするコードを書く方法がわからんかった
code:py
def melt_csv(in_file, out_file):
with open(out_file, 'w', encoding = 'utf-8') as f:
f.write('id,item,value\n')
with open(in_file, 'r', encoding = 'utf-8') as f:
lines = f.read().splitlines()
header = lines0.split(',')
for i in range(1,len(lines)):
s = linesi
data = s.split(',')
with open(out_file, 'a', encoding='utf-8') as g:
for j in range(1, len(data)):
g.write(f'{data0},{headerj},{dataj}\n')
遅くなるから1行書くたびにopenするのは変だというアドバイスをもらった
code:py
def melt_csv(in_file, out_file):
s_all = 'id,item,value\n'
with open(in_file, 'r', encoding = 'utf-8') as f:
lines = f.read().splitlines()
header = lines0.split(',')
for i in range(1,len(lines)):
s = linesi
data = s.split(',')
for j in range(1, len(data)):
s_all += f'{data0},{headerj},{dataj}\n'
with open(out_file, 'w', encoding = 'utf-8') as f:
f.write(s_all)
レコード
行
フィールド
カンマで区切られたレコード内の各領域
メモ
ヘッダを書き換える
id,item_1,item_2,item_3,...
id,item,value
レコードごとのitemとvalueを取り出す
取り出した値を別々のレコードとして格納する
f.read().splitlines()をwide型データに適用すると以下の状態になる
code:py
'id,subject,score', '0,English,60', '2,English,80', '4,English,100', '3,English,90', '2,Japanese,79', '1,Math,100', '1,English,70', '1,Japanese,70', '0,Japanese,61', '0,Math,100'
これの1要素ずつをカンマで区切ってリストに入れる
ヘッダとデータを結びつけるのはどうする?
ヘッダを例外として別の変数に格納する
1行ずつ書き込んでいく
まずはout_fileのheaderを書き込む
id,item,value
code:py
f.write('id,item,value,\n')
for i in range(1, len(data)):
f.write(f'{data0},{headeri},{datai}\n}')