Python 3.2 での数値 csv データの読み込み
csv モジュールで読み込んだ数値データの整形方法のメモ。
やりたいこと
x, y, z\n 1, 2, 3\n ... みたいなデータを csv モジュールで読み込んで list x, y, z にそれぞれ数値データとして格納したい。
その時の手順として、
- csv モジュールで文字列 list として読み込む。
- zip で転置させる。
- 行成分が tuple 型となるため map で list に整形する。
- 要素を文字列から数値に直す。
を踏む。なお、Python 3 から zip や map は「型」を吐くようになったので 2.x のようにするには list でキャストする必要がある。
あまり意味が無いが、そもそも数値を要素に持つ list だったらどうなるかも載せてみた。
ソースと入力からのデータの変わり方
#python 3.2 import csv fp = open('sample.csv', 'r') cr = csv.reader(fp, lineterminator='\n') xx0 = [] for row in cr: xx0.append(row) fp.close() xx1 = zip(*xx0) xx2 = list(xx1) xx3 = map(list, xx2) xx4 = list(xx3) xx5 = [[float(vv) for vv in v] for v in xx4] aa0 = [[1, 2, 3], [4, 5, 6]] aa1 = zip(*aa0) aa2 = list(aa1) aa3 = map(list, aa2) aa4 = list(aa3) aa5 = [[float(vv) for vv in v] for v in aa4] print(xx0, xx1, xx2, xx3, xx4, xx5, sep="\n") print('-----------------------------') print(aa0, aa1, aa2, aa3, aa4, aa5, sep="\n")
入力となる sample.csv は
1, 2, 3 4, 5, 6
で、出力は
[['1', ' 2', ' 3'], ['4', ' 5', ' 6']] <zip object at 0x00000000021BAB88> [('1', '4'), (' 2', ' 5'), (' 3', ' 6')] <map object at 0x0000000002286BE0> [['1', '4'], [' 2', ' 5'], [' 3', ' 6']] [[1.0, 4.0], [2.0, 5.0], [3.0, 6.0]] ----------------------------- [[1, 2, 3], [4, 5, 6]] <zip object at 0x00000000021C00C8> [(1, 4), (2, 5), (3, 6)] <map object at 0x0000000002286CC0> [[1, 4], [2, 5], [3, 6]] [[1.0, 4.0], [2.0, 5.0], [3.0, 6.0]]
という感じ。この手順覚えておこう。