Pythonを使ってCSVを操作(基礎編)
Pythonを使ってCSVを操作することができれば、アプリケーションから取り出したCSVファイルを使って独自の集計や別のアプリケーションのデータ移行などさまざまな場所で活用することができます。本文書ではPythonを使ったCSVからのデータの取得方法とCSVファイルの作成方法について解説を行っています。基礎的な内容なのでPythonの入門者でもわかる内容になっています。
目次
CSVとは
PythonでCSVを操作する前にCSVとは何かを確認しておきます。
CSVは主にアプリケーション間でデータのやり取りを行う際に使われるファイル形式です。例えば会計ソフトにECでの売り上げデータを一括で 取り込みたい時や新しく導入した顧客管理システムに既存の顧客情報を一括で取り込みたい時などに使うことができます。より身近であればSuica(スイカ)の利用履歴もCSVファイルで取得することができます。
CSVファイルの中身は下記のように項目がコンマで区切られたテキストファイルです。先頭には列名を表すヘッダー情報が入っており、2行目からは 列名に対応する値をもった商品情報が入っています。Windowsのメモ帳でもデータの作成、更新を行うことができ、テキスト情報のみのファイルなので、ファイルサイズも小さくアプリケーションに依存しないので取り扱いは非常に簡単です。
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)
- csvをpythonで操作するためにcsvモジュールを読み込みます
- 読み込むファイルのパスを指定
- open関数を使ってreadモードでファイルを開きます。
- 開いたファイルのデータをすべて取り出し、rows変数の中に保存します。
- for文を使ってrowsに保存されているデータを1行ずつ取り出します。
- print関数を使って画面に行情報を表示させます。
- 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つずつ取り出す
行の列情報へのアクセス方法
print関数を使って行全体の情報を表示させてきましたが、行の列毎の情報の取得方法を確認しておきます。
行の1列目の列の値を取得したい場合は、row[0]と指定します。
print(row[0]) # 1列目の情報のみ表示
4行目であればrow[3]というようにリストの番号を指定することで列の値にアクセスすることができます。
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']
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)
- csvをpythonで操作するためにcsvモジュールを読み込みます
- 書き込むファイルのパスを指定
- open関数を使ってwriteモードでファイルを開きます。
- ファイルオブジェクトをcsv.writerオブジェクトに変換します。
- wtirerowメソッドを利用してヘッダー情報をcsvファイルに書き込みます。
- writerowメソッドを利用して行情報を追加します。
- 3で開いたファイルを閉じます
上記のコードで作成したファイルを開くと下記のように1行空きで作成されます。
1行空きをなくすためには、ファイルをオープンする際にnewline=”を下記のように追加する必要があります。
f = open(file,'w',newline='')
newline設定後に再度実行すると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の操作を通してどのように業務の効率化につなげていくのかが重要になってきます。