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

CSVとは

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

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

これから顧客情報を含めデータベースに情報を保存するタイプのアプリケーションを検討している場合はCSVのエクスポート、インポートが可能なのか確認する必要があります。またプログラミングで効率化を考えている場合はさらにAPIでプログラムからアプリケーションに直接アクセスしてデータの送受信ができるかのチェックも重要です。それらの機能が存在しないまたは有償の場合があります。
fukidashi

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

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

EXCELで開いた場合は下記のように表示されます。

EXCELで見た場合
EXCELで見た場合

文字コードの注意

CSVの文字コードが各OSに適したものに設定されていないためCSVファイルをEXCELファイルで開いた時に文字化けを起こして見れないという場面に遭遇します。Windowsであればメモ帳でも文字コードの変更が可能なのでメモ帳を活用してください。

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ファイルに記述されている商品情報が画面に表示されます。


% python 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関数を記述する必要がなくファイルの閉じ忘れだけではなくよりシンプルでコードも読みやすくなります。7行から6行のコードへの短くになります。


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()を実行するとヘッダーと次の行をスキップすることができます。
fukidashi

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

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

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

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

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

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

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

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

	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で保存した場合は自動でダブルクォーテーションが入ります。
fukidashi

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でファイルが作成されます。
fukidashi

上記のコードで作成したファイルを開くと下記のように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行追加されることが確認できます。

ここまででCSVファイルからのデータの読み込みと書き込みを理解することができました。次はこれらのCSVの操作を通してどのように業務の効率化につなげていくのかが重要になってきます。