potass' blog

ポタシウムのことが書いてないブログ。

Python 3.2 での数値 csv データの読み込み

csv モジュールで読み込んだ数値データの整形方法のメモ。

やりたいこと

x, y, z\n 1, 2, 3\n ... みたいなデータを csv モジュールで読み込んで list x, y, z にそれぞれ数値データとして格納したい。
その時の手順として、

  1. csv モジュールで文字列 list として読み込む。
  2. zip で転置させる。
  3. 行成分が tuple 型となるため map で list に整形する。
  4. 要素を文字列から数値に直す。

を踏む。なお、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]]

という感じ。この手順覚えておこう。