Python CSV を扱う #1

株式会社リュディアです。今回から CSV ファイルの扱いについてまとめます。最初はファイルの読み込み、書き込みです。

CSV に特化したものではありませんがファイルの読み書きについてのまとめへのリンクは以下を参考にしてください。

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

最初に例として使う CSV ファイルです。以下のような CSV ファイルをエクセルで作成しました。このファイルの名前を note_read_sample.csv とします。note_read_sample.csv の内容は以下の通りです。

画像1

一般に CSV ファイルと言うとカンマ区切りを含むファイルと思いがちですが、厳密にはタブでもスペースでも区切り文字は何でもよいです。エクセルで CSVファイルで保存するとカンマ区切りになりますが、他から入手した CSV ファイルを利用する場合は最初にフォーマットを確認してください。本まとめでは扱う CSV ファイルはエクセルで作成したデータをCSV形式で保存したものであり、かつカンマ区切りであることを前提としています。

では以下の例から始めましょう。ここで open() メソッドの新しい引数 encoding を使います。

import csv

try:
   with open('note_read_sample.csv', 'r', encoding = 'utf_8-sig') as f:
       print(f.read())
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

特に CSV であることは利用せずに単に read() メソッドで読んだだけです。読み込んだ値はすべて文字列として扱われています。

次の例を見てみましょう。入力の CSV は同じものです。

import csv

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

# ['\ufeffa_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']

最初に \ufeff というコードが入っていますね。これは UTF-8 の BOM (Byte Order Mark) と呼ばれるもので、MS Excel で作った CSV の冒頭に含まれるそうです。MS Excel で作成した CSV は BOM あり UTF-8 に分類されるので encoding = 'utf_8-sig' を使う必要があります。

import csv

l = []

try:
   with open('note_read_sample.csv', 'r', encoding="utf_8-sig") as f:
       reader = csv.reader(f)
       for row in reader:
           l.append(row)
   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']]

CSVの各要素が Python のリストの要素として読み込まれ、かつ行単位で 1 つのリストを構成し読み込んだ結果全体がリストのリストのデータ構造になっていることがわかりますね。

最後に内包表記の場合についても記載しておきます。処理内容は同じです。

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']]

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

では、ごきげんよう。

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