Python CSV を扱う #5

株式会社リュディアです。今回は読み込んだ CSV ファイルのデータの扱いについてまとめてみます。

前回までの Python CSV を扱うついてのまとめへのリンクは以下を参考にしてください。


CSV のフォーマット自体に関するまとめは以下のリンクを参照してください。

では以前に使った入力 CSV ファイル note_read_sample.csv を以下に示します。今回はこれを使ってみます。

画像1

次に note_read_sample.csv を読み込みリストとして保持するスクリプトを実行結果とともに以下につけます。実行結果が見づらいので論理的な意味は変わらないように改行だけ追加しています。

import csv

try:
   with open('note_read_sample.csv', 'r', encoding = 'utf_8-sig') as f:
       reader = csv.reader(f)
       l = [row for row in reader]
   print(l)
except FileNotFoundError as e:
   print('File not found', e)

# [['a_1', 'b_1', 'c_1', 'd_1', 'e_1', 'f_1', 'g_1'],
#  ['a_2', 'b_2', 'c_2', 'd_2', 'e_2', 'f_2', 'g_2'],
#  ['a_3', 'b_3', 'c_3', 'd_3', 'e_3', 'f_3', 'g_3'],
#  ['a_4', 'b_4', 'c_4', 'd_4', 'e_4', 'f_4', 'g_4'],
#  ['a_5', 'b_5', 'c_5', 'd_5', 'e_5', 'f_5', 'g_5']]

皆さんはこの中の任意のデータにアクセスする方法は想像つきますか?以下にいくつかの例をつけておきますので予測しながら試してみてください。

print(l[0])
# ['a_1', 'b_1', 'c_1', 'd_1', 'e_1', 'f_1', 'g_1']

最初は l[0] です。Python の二次元リストとエクセルのデータの並びは以下のような関係になっています。

画像2

そのため l[0] という指定は a_1 から行方向(横方向)に 1 行を取得することになります。

print(l[0][1])
# b_1

では次の例です。l[0][1] なので、縦方向のインデクスが 0 、横方向のインデクスが 1 となるような場所にある要素なので b_1 になります。

画像3

print(l[0:3])
# [['a_1', 'b_1', 'c_1', 'd_1', 'e_1', 'f_1', 'g_1'],
#  ['a_2', 'b_2', 'c_2', 'd_2', 'e_2', 'f_2', 'g_2'],
#  ['a_3', 'b_3', 'c_3', 'd_3', 'e_3', 'f_3', 'g_3']]

次は l[0:3] です。この場合、 0 ~ 3 の範囲ではなくて 0 ~ 2 の範囲の行になります。最後の 3 行は含みません。for ループで for i in range(0, 10) とした場合に最後の 10 が含まれないのと同じと考えてください。

print(l[1][0:5])
# ['a_2', 'b_2', 'c_2', 'd_2', 'e_2']

次は l[1][0:5] です。以下の図を見てください。l[1] で行インデクス 1 の行になり、[0:5] と指定することで 0 ~ 4 の列インデクスを示すことになり以下の図の緑の領域に合致します。

ちなみに l[1:3][2] のような記述はエラーになります。行を複数行指定して列の一部というのは Python 標準のリストを使った二次元配列では扱えないのでご注意ください。

Python CSVを扱うに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?