この記事では、csvファイルの処理に非常に便利なPython CSVモジュールについて見ていきます。
Pythonにバンドルされているこのモジュールを使うと、CSVファイルの読み書きが簡単にできるようになります。
さっそく始めてみましょう
Python の csv モジュールを利用する
関連するメソッドを使用するために、csvモジュールをインポートする必要があります。
import csv
|
さて、何をしたいかに応じて、適切なオブジェクトを使ってcsvファイルを読んだり、書き込んだりすることができます。
まず、csvファイルの読み込みについて見てみましょう。
csv.reader() を使って csv ファイルから読み込む
csv ファイルから読み込むには、reader オブジェクトを構築する必要があり、そのオブジェクトがファイルをパースして Python オブジェクトにデータを取り込みます。
Pythonの csv モジュールは csv.reader() というメソッドを持っており、これが自動的にcsv readerオブジェクトを構築してくれます。
すでにオープンされているファイルオブジェクトに対して、 open() を用いて csv.reader() メソッドを呼び出す必要があります。
import csv
reader = csv.reader(file_object)
|
通常、推奨されるアプローチは、すべてを with コンテキストマネージャで囲むことです。
これと似たようなことをすることができます。
import csv
# Open the csv file objectwith open('sample.csv', 'r') as f:
# Construct the csv reader object from the file object
reader = csv.reader(f)
|
reader オブジェクトは、csv ファイル内のすべての行からなる反復処理可能なオブジェクトになります。
そのため、以下のように for ループを使用して行を直接表示することができます。
for row in reader:
print(row)
|
さてさて。
さて、基本的なテンプレートができたので、csv.reader()を使って以下のファイルの中身を表示してみましょう。
ここでは、sample.csv が以下の内容であると仮定します。
Club,Country,RatingMan Utd,England,7.05Man City,England,8.75Barcelona,Spain,8.72Bayern Munich,Germany,8.75Liverpool,England,8.81 |
では、コードを実行してみましょう。
import csv
with open('sample.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print(row)
|
結果は以下の通りです。
['Club', 'Country', 'Rating']['Man Utd', 'England', '7.05']['Man City', 'England', '8.75']['Barcelona', 'Spain', '8.72']['Bayern Munich', 'Germany', '8.75']['Liverpool', 'England', '8.81'] |
さて、これですべての行を取得できました。
ここでは、csv がカンマの後に空白を与えているのがわかると思います。
もし、個々の単語を空白文字で区切って解析したい場合は、区切り文字として csv.reader(delimiter=' ') に渡せばいいのです。
では、修正したコードを試してみましょう。
import csv
with open('sample.csv', 'r') as f:
reader = csv.reader(f, delimiter=' ')
for row in reader:
print(row)
|
結果は以下の通りです。
出力
['Club,', 'Country,', 'Rating']['Man', 'Utd,', 'England,', '7.05']['Man', 'City,', 'England,', '8.75']['Barcelona,', 'Spain,', '8.72']['Bayern', 'Munich,', 'Germany,', '8.75']['Liverpool,', 'England,', '8.81'] |
確かに、単語が分割され、 Man Utd は Man と Utd になりました。
同様に、区切られた内容をパースしたい場合は、区切り文字として csv.reader() に渡します。
次に、csvファイルへの書き込みについて見てみましょう。
csv.writer()を使ったcsvファイルへの書き込み
読み込み用のメソッドである csv.reader() と同様に、ファイルへの書き込み用のメソッドである csv.writer() も用意されています。
このメソッドは writer オブジェクトを返し、これを用いて出力先のファイルに行を書き込むことができます。
これをどのように使うか見てみましょう。
まず、writer オブジェクトを作成します。
import csv
with open('output.csv', 'w') as f:
writer = csv.writer(f)
|
次に、 writer.writerow(row) メソッドを使って行を書き込むことができます。
ここでは、リーダーオブジェクトと同様に、 row はリストです。
したがって、このメソッドは次のように呼び出すことができます。
writer.writerow(['Club', 'Country', 'Rating'])
|
それでは、プログラム全体を見てみましょう。
import csv
with open('output.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['Club', 'Country', 'Rating'])
clubs = [['Real Madrid', 'Spain', 9.1], ['Napoli', 'Italy', 7.5]]
for club in clubs:
writer.writerow(club)
|
では、output.csvを見てみましょう。
Club,Country,RatingReal Madrid,Spain,9.1Napoli,Italy,7.5 |
確かに、出力ファイルに行が表示されていますね。
注意: csv.reader(delimiter) と同様に、 csv.writer(delimiter) を使用して、区切り文字を渡すこともできます。
よく観察すると、私たちは行のリスト(list of lists)を繰り返し、各行を一つずつ書き込んでいます。
しかし、writer.writerows(rows)という別のメソッドがあり、これを使えば全ての行を直接書き込むことができることがわかりました。
試してみましょう。
出力.csv`を削除して、以下のコードを実行してください。
import csv
with open('output.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['Club', 'Country', 'Rating'])
clubs = [['Real Madrid', 'Spain', 9.1], ['Napoli', 'Italy', 7.5]]
writer.writerows(clubs)
|
結果は以下の通りです。
Club,Country,RatingReal Madrid,Spain,9.1Napoli,Italy,7.5 |
確かに前と同じ出力が得られました!
csv.DictReader() と csv.DictWriter() を使って、csv を Dictionary として読み書きする
reader` オブジェクトを使って読み込むとき、オブジェクトを行単位でリストとして取得したのを覚えていますか?
もし、 column_name: row_name のマッピングを正確に行いたいのであれば、 csv.DictReader クラスを使用して、代わりに Dictionary を取得することができます!
では、どのようにして csv ファイルから辞書を読み込むかを見てみましょう。
import csv
with open("sample.csv", 'r') as file:
csv_file = csv.DictReader(file)
for row in csv_file:
print(dict(row))
|
ここでは、 csv.DictReader() は OrderedDict() オブジェクトのイテラブルを返します。
各 OrderedDict の行を dict(row) を使用して dict に変換する必要があります。
出力を見てみましょう。
{'Club': 'Man Utd', ' Country': ' England', ' Rating': ' 7.05'}{'Club': 'Man City', ' Country': ' England', ' Rating': ' 8.75'}{'Club': 'Barcelona', ' Country': ' Spain', ' Rating': ' 8.72'}{'Club': 'Bayern Munich', ' Country': ' Germany', ' Rating': ' 8.75'}{'Club': 'Liverpool', ' Country': ' England', ' Rating': ' 8.81'} |
確かに、カラムの名前と行の値を得ることができました!
さて、Dictionaryからcsvファイルに書き出すには、 csv.DictWriter() クラスがあります。
これは、リストではなくDictionaryから書き込むという点を除けば、 csv.write() とほとんど同じです。
しかし、構文は少し異なります。
あらかじめ、 fieldnames の一部としてカラム名を指定しておかなければなりません。
それから、writer.writeheader() を使用して最初の行 (ヘッダー) を記述する必要があります。
fieldnames = ['Club', 'Country', 'Rating']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() |
これで、関連する情報を持つ dicts のリストを繰り返し実行できるようになりました。
それでは、 csv.DictWriter() を使用して、以前の writer の例を書き直してみましょう。
import csv
with open('output.csv', 'w') as f:
fieldnames = ['Club', 'Country', 'Rating']
# Set the fieldnames
writer = csv.DictWriter(f, fieldnames=fieldnames)
# Write the header
writer.writeheader()
clubs = [{'Club': 'Real Madrid', 'Country': 'Spain', 'Rating': 9.1}, {'Club': 'Napoli', 'Country': 'Italy', 'Rating': 7.5}]
for club in clubs:
writer.writerow(club)
|
これは、 csv.DictWriter() オブジェクトを使用して csv ファイルに書き込むことに成功したことを示します!
まとめ
csv` モジュールを使って csv ファイルを簡単に処理する方法を理解していただけたと思います。
適切なオブジェクトを使って、csvファイルへの読み書きを簡単に行えるようにしました。
参考文献
- Pythonでcsvファイルの読み書きをするJournalDevの記事