Pythonを使ってCSVを操作することができれば、アプリケーションから取り出したCSVファイルを使って独自の集計や別のアプリケーションのデータ移行などさまざまな場所で活用することができます。本文書ではPythonを使ったCSVの操作方法について説明を行っています。

CSVとは

PythonでCSVを操作する前にCSVとは何かを確認しておきます。

CSVは主にアプリケーション間でデータのやり取りを行う際に使われるファイル形式です。例えば会計ソフトにECでの売り上げデータを 一括で 取り込みたい時や新しく導入した顧客管理システムに既存の顧客情報を一括で取り込みたい時などに使うことができます。より身近であればSuica(スイカ)の利用履歴もCSVファイルで取得することができます。

CSVファイルの中身は下記のように項目がコンマで区切られたテキストファイルです。先頭には列名を表すヘッダー情報が入っており、2行目からは 列名に対応する値をもった商品情報が入っています。Windowsのメモ帳でもデータの作成、更新を行うことができ、テキスト情報のみのファイルなので、ファイルサイズも小さくアプリケーションに依存しないので取り扱いは非常に簡単です。

メモ帳でCSVファイルを開く
メモ帳でCSVファイルを開く
CSVファイルはEXCELやGoogleSheetを使っても作成、更新を行うことができます。

CSVの作成される場所

通常CSVファイルはアプリ―ションからデータをエクスポートする(取り出す)際にアプリケーション側で作成されるものものが大半を占めています。ユーザ側でもCSVファイルを作成することがありますが、作成したデータはアプリケーションにインポート(取り込む)する場合が多く、アプリケーションが示すルールに沿ってCSVファイルを作成する必要があります。ユーザはExcelやGoogleSheetを使ってデータを入力し、CSVファイルとして保存します。

通常CSVファイルはアプリ―ションからデータをエクスポートする(取り出す)際にアプリケーション側で作成されるものものが大半を占めています。ユーザ側でもCSVファイルを作成することがありますが、作成したデータはアプリケーションにインポート(取り込む)する場合が多く、アプリケーションが示すルールに沿ってCSVファイルを作成する必要があります。ユーザはExcelやGoogleSheetを使ってデータを入力し、CSVファイルとして保存します。

CSVファイルの読み込み

下記の操作はすべてWindows10上で行っています。

Pythonでは標準ライブラリの中にCSVモジュールが入っているので追加のインストールを行うことなくCSVファイルを読み込むことができます。

シンプルな形のCSVファイル読込

プログラムファイルの名前は任意につけることができますが、ここではtest.pyとしています。

一番わかりやすくシンプルな形で記述すると下記のようになります。7行でCSVファイルに記述されている内容を表示することができます。


import csv #csvモジュールの読み込み(1)

file = './products.csv' #ファイルのパスを指定(2)

f = open(file,'r') #ファイルをオープン(3)

rows = csv.reader(f) #ファイルからデータを読み込み(4)

for row in rows: # for文で行を1つずつ取り出す(5)

	print(row) # rowの中身を表示(6)

f.close() #開いたファイルをクローズ(7)
  1. csvをpythonで操作するためにcsvモジュールを読み込みます
  2. 読み込むファイルのパスを指定
  3. open関数を使ってreadモードでファイルを開きます。
  4. 開いたファイルのデータをすべて取り出し、rows変数の中に保存します。
  5. for文を使ってrowsに保存されているデータを1行ずつ取り出します。
  6. print関数を使って画面に行情報を表示させます。
  7. 3で開いたファイルを閉じます。

作成したtest.pyファイルを実行するとproducts.csvファイルに記述されている商品情報が画面に表示されます。


>py test.py
['商品ID', '部門ID', '商品コード', '商品名', '商品単価']
['1', '1', '1001', '商品A', '1000']
['2', '1', '1002', '商品B', '1000']
['3', '1', '1003', '商品C', '1000']
['4', '1', '1004', '商品D', '2000']
['5', '1', '1005', '商品E', '2000']
['6', '1', '1006', '商品F', '2000']

指定するファイルを変更することでどのようなCSVファイルでも読み込むことができます。

with構文を利用した場合

ファイルを開く時にwith構文を利用することができます。with構文を利用するとファイルを閉じるclose関数を記述する必要がなくファイルの閉じ忘れだけではなくよりシンプルでコードも読みやすくなります。


import csv #csvモジュールの読み込み

file = './products.csv' #ファイルのパスを指定

with open(file,'r') as f: #ファイルをオープン 

	rows = csv.reader(f) #ファイルからデータを読み込み

	for row in rows: # for文で行を1つずつ取り出す

		print(row) # rowの中身を表示

文字コードの設定

今回のファイルはWindowsのExcelを利用して作成したため、文字コードはShift-JIS(CP932)で作成されます。しかし、ダウンロードしたファイルは必ずShitf-JIS (CP932) ではなくUTF-8など他の文字コードで作成されている場合があります。 UTF-8 で作成されたファイルを上記のプログラムのまま実行すると下記のUnicodeDecodeErrorエラーが表示されます。


UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence

その場合はファイルを開くときにencodingでUTF-8を指定すると正常にCSVの内容を読み込むことができます。


f = open(file,'r',encoding="utf-8")

逆にShift-JIS (CP932) のファイルをUTF-8で読み込むと UnicodeDecodeError エラーが発生します。エラーが出た場合は、encodingにcp932を指定するとCSVファイルの内容を正常に読み込むことができます。


UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 4: invalid start byte

ヘッダーをスキップする

CSVファイルの先頭にあるヘッダーが必要ない場合は、先頭のヘッダー行をスキップすることができます。


rows = csv.reader(f)

header = next(rows) #header行をスキップ

for row in rows: # for文で行を1つずつ取り出す
next()はヘッダー行のスキップだけではなく行をスキップする関数なので、2度next()を実行するとヘッダーと次の行をスキップすることができます。

行の列情報へのアクセス方法

print関数を使って行全体の情報を表示させてきましたが、行の列毎の情報の取得方法を確認しておきます。

行の1列目の列の値を取得したい場合は、row[0]と指定します。

1ではなく0から始まるので列番号の指定は注意して行ってください。

print(row[0]) # 1列目の情報のみ表示

4行目であればrow[3]というようにリストの番号を指定することで列の値にアクセスすることができます。

4番目の列情報のみ取得
4番目の列情報のみ取得

print(row[3]) # 商品名の列を指定のみ表示

実行すると商品名の列情報のみ表示させることができます。


>py test.py
商品A
商品B
商品C
商品D
商品E
商品F

金額のコンマの取り扱い

CSVファイルはコンマで項目が区切られているという話をしました。では金額に10,000のようにコンマが入っている場合どのような処理を行えばよいか確認していきます。

下記のようなCSVファイルを作成して読み込んでみましょう。


価格
10,000

実行するとコンマが項目の区切りだと判断して2列として扱われます。


['価格']
['10', '000']

コンマを項目の区切りとして使わない場合はダブルクォーテーションを使用します。


価格
"10,000"

ダブルクォーテーションをつけた状態で実行すると下記のように表示されます。


['価格']
['10,000']
Excelを使ってデータを作成し、CSVで保存した場合は自動でダブルクォーテーションが入ります。

CSVファイルの作成

シンプルな形のCSVファイル作成

pythonのCSVモジュールを利用して新しくCSVファイルの作成を行います。ファイルを作成するためのコードは下記の通りです。


import csv #csvモジュールの読み込み(1)

file = './products2.csv' #ファイルのパスを指定(2)

f = open(file,'w') #ファイルをオープン (3)

csv_writer = csv.writer(f) #ファイルオブジェクトをcsv.writerオブジェクトに変換(4)

csv_writer.writerow(['商品ID','部門ID','商品コード','商品名','商品単価']) #ヘッダー追加(5)

csv_writer.writerow([7,1,1007,'商品G',2000]) #行追加(6)

f.close() #開いたファイルをクローズ(7)
  1. csvをpythonで操作するためにcsvモジュールを読み込みます
  2. 書き込むファイルのパスを指定
  3. open関数を使ってwriteモードでファイルを開きます。
  4. ファイルオブジェクトをcsv.writerオブジェクトに変換します。
  5. wtirerowメソッドを利用してヘッダー情報をcsvファイルに書き込みます。
  6. writerowメソッドを利用して行情報を追加します。
  7. 3で開いたファイルを閉じます
Windowsの場合文字コードを指定しない場合はShift-JISでファイルが作成されます。

上記のコードで作成したファイルを開くと下記のように1行空きで作成されます。

作成されたファイルは1行空き
作成されたファイルは1行空き

1行空きをなくすためには、ファイルをオープンする際にnewline=”を下記のように追加する必要があります。


f = open(file,'w',newline='')

newline設定後に再度実行すると1行空きの問題は解決します。

new_line=""で1行空き問題解消
new_line=””で1行空き問題解消

リストの書き込み(1行毎)

リストデータの書き込みも行うことができます。


import csv #csvモジュールの読み込み

file = './products.csv' #ファイルのパスを指定

data = [['商品ID', '部門ID', '商品コード', '商品名', '商品単価'],
['1', '1', '1001', '商品A', '1000'],
['2', '1', '1002', '商品B', '1000'],
['3', '1', '1003', '商品C', '1000'],
['4', '1', '1004', '商品D', '2000'],
['5', '1', '1005', '商品E', '2000'],
['6', '1', '1006', '商品F', '2000']]

f = open(file,'w',newline='') #ファイルをオープン 

csv_writer = csv.writer(f) #ファイルオブジェクトをcsv.writerオブジェクトに変換

for row in data:

	csv_writer.writerow(row) #行追加

f.close() #開いたファイルをクローズ

for文を利用してリストデータを1行ずつファイルに書き込みを行っています。

リストの書き込み(一括)

リストデータを一括でファイルに書き込むことができます。writerowメソッドからwriterowsメソッドに変更して、リストを指定すれば一括でファイルにリストデータが保存されます。


import csv #csvモジュールの読み込み

file = './products3.csv' #ファイルのパスを指定

data = [['商品ID', '部門ID', '商品コード', '商品名', '商品単価'],
['1', '1', '1001', '商品A', '1000'],
['2', '1', '1002', '商品B', '1000'],
['3', '1', '1003', '商品C', '1000'],
['4', '1', '1004', '商品D', '2000'],
['5', '1', '1005', '商品E', '2000'],
['6', '1', '1006', '商品F', '2000']]

f = open(file,'w',newline='') #ファイルをオープン 

csv_writer = csv.writer(f) #ファイルオブジェクトをcsv.writerオブジェクトに変換

csv_writer.writerows(data) #行一括追加

f.close() #開いたファイルをクローズ

ファイルへの追記

先ほどは新しくファイルを作成しましたが、既存のファイルに追加することもできます。

ファイルをオープンするときにa(append)の追記モードでオープンします。


import csv #csvモジュールの読み込み

file = './products.csv' #ファイルのパスを指定

f = open(file,'a',newline='') #aモードでファイルをオープン 

csv_writer = csv.writer(f) #ファイルオブジェクトをcsv.writerオブジェクトに変換

csv_writer.writerow(['7', '1', '1007', '商品G', '2000']) #行追加

f.close() #開いたファイルをクローズ

プログラムを実行すると既存のproducts.csvファイルの最後の行に新たに1行追加されることが確認できます。