エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Python入門時におさえておきたいcsvファイルの操作方法を紹介していきます。
ちなみにCSVファイルとは、Comma Separated Valueの略であり、Comma(カンマ)でSeparated(区切った)、Value(値・データ)をファイルに保存したものです。
このCSVファイルをPythonでどうやって操作するか見ていきます。
なお、本記事内のPythonソースコードは、Visual Studio Code (VS Code)で動作を確認しています。
同様に動作確認したい方はこちらの記事も参照し、まずはVS Codeの環境構築をおこなうとよいでしょう。
CSVファイルのオープン(open)とクローズ(close)
CSVファイル操作の基本として、CSVファイルのオープンとクローズする方法をみていきましょう。
まずCSVファイルを扱う際には、以下のようにcsvモジュールをインポートする必要があります。
1 |
import csv |
これにより、csvモジュールのさまざまなクラスやメソッドを使うことができます。
CSVファイルをオープンするには、以下のコードのようにopenメソッドを使用し、第一引数にCSVファイル名、第二引数にモードを指定します。
第二引数のモードが’r’ならば読み込み専用、’w’ならば書き込み専用、’a’ならば追記モードとしてファイルをオープンすることを意味します。
【Pythonコード】
1 2 3 4 5 6 7 8 |
import csv with open('test.csv', 'r') as csv_file: # CSVファイルオープン後の処理1 # CSVファイルオープン後の処理2 print('withステートメント内の最後の処理です') print('withステートメント外の処理です') |
上記コードは、withステートメントを使ってopenメソッドを使っているため、withステートメント内の最後の処理が終わると、自動的にopenメソッドに対応するcloseメソッドが実行されます。
よって、withステートメントでCSVファイルをオープンすると、closeメソッドは不要となり、コードを短く書けてCSVファイルのクローズし忘れ防止になるので、一番メジャーなコードとなっています。
これを覚えておけば、CSVファイルのオープン、クローズは大丈夫です。
CSVファイルのデータ読み込み(csv.reader)
次はCSVファイルのデータ読み込みを学んでいきましょう。
基本的な使い方
基本的な使い方は、以下のコードのようになります。
【Pythonコード】
1 2 3 4 5 6 7 |
import csv with open('test.csv', 'r') as csv_file: reader = csv.reader(csv_file) # CSVファイルからデータを読み込み for line in reader: # line変数に1行ずつデータを取得 print (line) # 取得した行のデータを表示 |
まずCSVファイルのデータ読み込みには、csvモジュール内のcsv.readerクラスを使用します。
このcsv.readerクラスにcsv_file変数を引数にすることで、CSVファイルのデータを読み込むことができます。
その後、for文のline変数にCSVファイルのデータを行単位で読み出し、print文で表示しています。
これが基本的な使い方になります。
行・要素を取得
次に読み込んだCSVファイルのデータの行や要素を取得する方法を紹介します。
【data.csv】
apple,orange,banana dog,cat,pig red,blue,yellow |
【Pythonコード】
1 2 3 4 5 6 7 8 |
import csv with open('data.csv', 'r') as csv_file: reader = csv.reader(csv_file) # CSVファイルからデータを読み込み line = [row for row in reader] # CSVファイルのデータを2次元リストにする print(line[0]) # 行を表示 print(line[0][0]) # 要素を表示 |
上記のコードでは、リストの内包表記を使って、CSVファイルのデータを二次元リストとしてline変数に読み込んでいます。
リストの内包表記がわからない場合は、こちらのPythonドキュメントを参照してください。
二次元リストであるline変数のイメージは、以下の通りです。
x / y | line[x][ 0 ]
(y = 0) |
line[x][ 1 ]
(y = 1) |
line[x][ 2 ]
(y = 2) |
---|---|---|---|
line[ 0 ]
(x = 0) |
apple | orange | banana |
line[ 1 ]
(x = 1) |
dog | cat | pig |
line[ 2 ]
(x = 2) |
red | blue | yellow |
二次元リストであるline変数を使うと、一行目を表示するにはprint(line[0])、一行目一列目の要素を表示するにはprint(line[0][0])と実行すればできます。
【実行結果】
[‘apple’, ‘orange’, ‘banana’]
apple |
列を取得
列を取得する場合は、行と列を入れ替える転置を行った後、行の表示と同様に「インデックス[ ]」でアクセスします。
以下のコードでは、二次元リストのline変数をベースに行と列を入れ替えて転置したline_transpos変数を用意しています。
その後、line_transpos[0]で0番目の行を表示すると、もともとあったline変数の0番目の列を表示できます。
【Pythonコード】
1 2 3 4 5 6 7 8 9 |
import csv with open('data.csv', 'r') as csv_file: reader = csv.reader(csv_file) line = [row for row in reader] # 2次元リストを作成 print(line[0]) # 行を表示 line_transpos = list(zip(*line)) # zip関数によって転置した2次元リストを作成 print(line_transpos[0]) # 列を表示 |
区切り文字(delimiter)の指定
csv.readerクラスの第二引数で「delimiter = 区切り文字」を指定することができます。
これにより、カンマ以外の区切り文字で区切られたデータも処理することができます。
たとえば、TSVファイルはTab Separated Valueの略であり、Tab(タブ)でSeparated(区切った)、Value(値・データ)をファイルに保存したものですから、以下のように処理が可能です。
【data.tsv】
apple orange banana dog cat pig red blue yellow |
【Pythonコード】
1 2 3 4 5 6 7 8 |
import csv with open('data.tsv', 'r') as tsv_file: reader = csv.reader(tsv_file, delimiter = ‘ \t') # TSVファイルから読み込み line = [row for row in reader] # TSVファイルのデータを2次元リストにする print(line[0]) # 特定の行を表示 print(line[0][0]) # 要素を表示 |
辞書として読み込み(csv.DictReader)
CSVファイルの各要素を辞書として読み込む方法を確認していきましょう。
まず辞書として読み込む場合、csv.DictReaderクラスを使用します。
DictReaderのDictは、Dictionary(辞書)を意味しています。
また、CSVファイル内の一行目のヘッダーに辞書のキー(key)がある場合、ない場合の2通りで紹介していきます。
CSVファイルのデータの一行目にヘッダーがある場合(fieldnames)
CSVファイルのデータの一行目にヘッダーがある場合、csv.DictReaderクラスのデフォルトで一行目をヘッダーと認識し、一行目の各項目を辞書のキー(key)として読み込まれます。
sample.csvの例では、ID、Name、Genderの三つが辞書のキー(key)となります。
【sample.csv】
ID,Name,Gender 1,Miura,Man 2,Sato,Woman 3,Tanaka,Man 4,Nishi,Woman |
【Pythonコード】
1 2 3 4 5 6 7 |
import csv with open('sample.csv', 'r') as csv_file: reader = csv.DictReader(csv_file) for row in reader: print(row['ID'], row['Name'], row['Gender']) |
row変数には、for文で各行の要素を辞書型で保存されているので、row変数のインデックスにキー(key)を指定することで要素へアクセスし、表示できます。
CSVファイルのデータの一行目にヘッダーがない場合(fieldnames)
CSVファイルのデータの一行目にヘッダーがない場合、csv.DictReaderクラスの第二引数fieldnamesに辞書のキー(key)にあたる値をリストで指定する必要があります。
これ以外はCSVファイル内にヘッダーがある場合と同じです。
【sample2.csv】
1,Miura,Man 2,Sato,Woman 3,Tanaka,Man 4,Nishi,Woman |
【Pythonコード】
1 2 3 4 5 6 7 |
import csv with open('sample2.csv', 'r') as csv_file: reader = csv.DictReader(csv_file, fieldnames=['ID', 'Name', 'Gender'], ) for row in reader: print(row['ID'], row['Name'], row['Gender']) |
CSVファイルにデータ書き込み(csv.writer)
CSVファイルのデータ読み込みができたら、データの書き込み方法をみていきましょう。
基本的な使い方
基本的な使い方は、以下のコードのようになります。
【Pythonコード】
1 2 3 4 5 6 |
import csv with open('test.csv', 'w') as csv_file: # CSVファイルを書き込みモードで開く writer = csv.writer(csv_file) writer.writerow(['apple', 'orange', 'banana']) # リストの内容を書き込む |
上記コードは、openメソッドの第二引数のモードを’w'(書き込み専用)でオープンしています。
その後、csv.writerクラスにcsv_fileを渡したwriter変数を使い、writerowメソッドでリスト(‘apple’, ‘orange’, ‘banana’)をファイルに書き込んでいます。
【test.csv】
apple,orange,banana |
これが基本的な使い方になります。
データを追記
既存のCSVファイルにデータを追記するには、以下のコードのようにopenメソッドの第二引数のモードに’a'(追記モード)を指定し、’w'(書き込みモード)のときと同様にwriterowメソッドでリストの内容を書き込むと追記できます。
【Pythonコード】
1 2 3 4 5 6 |
import csv with open('test.csv', 'a') as csv_file: # CSVファイルを追記モードで開く writer = csv.writer(csv_file) writer.writerow(['dog', 'cat', 'pig']) # リストの内容を追記する |
【test.csv】
apple,orange,banana dog,cat,pig |
区切り文字(delimiter)の指定
csv.readerクラスと同様に、csv.writerクラスの第二引数delimiterに区切り文字を指定することができます。
以下のコードでは、data2.tsvファイルをオープンし、タブ区切りに設定したcsv.writerクラスの変数を用意しています。
その後、writerowメソッドでリストをTSVファイルに書き込んでいます。
【Pythonコード】
1 2 3 4 5 6 |
import csv with open('data2.tsv', 'w') as tsv_file: # ’w’は書き込みモード writer = csv.writer(tsv_file, delimiter='\t') writer.writerow(['apple', 'orange', 'banana']) # TSVファイルにリストを書き込み |
ここでおさえておきたいことは、csvファイルに書き込むときと同様にwriterrowメソッドの引数にはリストを指定している点です。
tsvファイルを扱うからといって、writerowメソッドの引数にタブ区切りの文字列を渡すわけではありません。
引数にリストを渡し、タブ区切りに設定したcsv.writerクラスの変数で書き込んでいるので、出力結果のdata2.tsv内にはタブ区切りで値が書き込まれます。
【data2.tsv】
1 |
apple orange banana |
辞書を書き込み(csv.DictWriter)
csv.DictWriterクラスを使って各行に辞書を書き込むことができます。
csv.DictReaderクラスのときと同様にヘッダーありとなしの場合で見ていきましょう。
CSVファイルのデータの一行目にヘッダーを書きたい場合(fieldnames)
以下のコードでは、csv.DictWriterクラスの第二引数fieldnamesに辞書のキー(key)を指定することでヘッダーを設定し、writeheaderメソッドでヘッダーを書き込んでいます。
その後、writerowメソッドの引数に辞書を渡すことで辞書を書き込むことができます。
【Pythonコード】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import csv d1 = {'ID': 1, 'Name': 'Miura', 'Gender': 'Man'} d2 = {'ID': 2, 'Name': 'Sato', 'Gender': 'Woman'} d3 = {'ID': 3, 'Name': 'Tanaka', 'Gender': 'Man'} d4 = {'ID': 4, 'Name': 'Nishi', 'Gender': 'Woman'} with open('data2.csv', 'w') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=['ID', 'Name', 'Gender']) writer.writeheader() writer.writerow(d1) writer.writerow(d2) writer.writerow(d3) writer.writerow(d4) |
【data2.csv】
ID,Name,Gender 1,Miura,Man 2,Sato,Woman 3,Tanaka,Man 4,Nishi,Woman |
CSVファイルのデータの一行目にヘッダーを書かない場合(fieldnames)
ヘッダーを書きたくない場合は、writeheaderメソッドを実行しなければよいだけです。
まとめ
CSVファイル操作のまとめはいかがでしたでしょうか。
「実践に勝るものなし!」ということで、実際にVS Code上で動作確認して身につけてください。
最後にCSVファイルの操作については、データのやりとりやデータベースなどとも連携して使うこともあるのでぜひここでおさえておくと、アプリケーション開発に役立てられることと思います。