PythonのCSVファイルの操作は、基本的には標準の機能で対応することができます。
他の言語だと、ファイルを読み込んでカンマを分割してといった流れで処理をする場合がありました。
しかし、PythonではそんなことをせずにCSVファイルを操作することができます。
この記事では、Pythonの標準機能を使ってCSVファイルを操作する書き方を、サンプルをふまえて解説しています。
他にもPythonでいろいろなファイルの読み書きを解説しています。
ご興味があれば、下記の記事もご覧ください。
-
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...続きを見る
CSVファイルとは
CSVファイルのCSVは、Comma Separated Valuesの略でカンマ区切りのデータファイルをCSVファイルと指します。
Windowsだと、マイクロソフトのエクセルなどの開いたりする場合がありますが、実際はテキストデータなので通常のテキストエディタで開くことができます。
CSVデータによっては、マイクロソフトのエクセルで開くことで壊れる場合もあるので注意が必要です。
CSVの他にも、TSVファイルというものがあります。
これは、カンマの代わりにタブ文字を使った区切り文字のデータファイルになります。
CSVファイルの読み込み
CSVファイルを読み込むには、open関数を使います。
このopen関数については、テキストファイルを読み込む方法と同じです。
下記が、ファイルを読み込む処理になります。
with open('sample.csv') as f:
pass
open関数やのwith構文について知りたい場合は、この記事をご確認ください。
-
PythonでTEXTを操作!読み込みから書き込みまでの基本
Pythonを使ったテキストを操作するために、読み込みから書き込みといった使い方を解説します。 読み込みに関しては、1行ずつ読み込んだり読み込んだファイルをリスト化したりといった手法もサンプルコードを元に説明しています。 他にもPython ...続きを見る
実際にサンプルCSVファイルを作成して読み込んでみます。
CSVのサンプルデータは下記になります。
商品,単価,数量
A商品,500,1
B商品,1000,2
読み込むコードは下記になります。
import csv
with open('sample.csv') as f:
data = csv.reader(f)
for line in data:
print(line)
CSVファイルの操作をするには、csvをインポートする必要があります。
テキストの扱いと違うのは、インポートしたcsvにあるreader関数を使います。
その引数に、読み込んだファイルの値をセットします。
結果は下記になります。
['商品', '単価', '数量']
['A商品', '500', '1']
['B商品', '1000', '2']
区切り文字の指定
CSVのカンマ区切りの他に、タブ区切りのデータや他の区切り文字を利用したデータを扱う方法もできます。
他の文字を扱うには、reader関数で引数にdelimiterを指定することです。
指定することで、他の区切り文字を使ったファイルの対応ができます。
今回CSVファイルの中身をスペースにしています。
商品 単価 数量
A商品 500 1
B商品 1000 2
このデータを区切り文字を指定せずに読み込むと、区切られずに1行のデータとして扱われます。
import csv
with open('sample.csv') as f:
data = csv.reader(f)
for line in data:
print(line)
結果は下記になります。
['商品 単価 数量']
['A商品 500 1']
['B商品 1000 2']
この結果を個別に取得する場合は、readerで区切り文字を指定します。
import csv
with open('sample.csv') as f:
data = csv.reader(f, delimiter=' ') # 引数に区切り文字を設定
for line in data:
print(line)
ここでの区切り文字はスペースになります。
この結果は下記になります。
['商品', '単価', '数量']
['A商品', '500', '1']
['B商品', '1000', '2']
結果は問題なく区切られたデータで取得できているのがわかります。
引用符の取り扱い
この引用符の取り扱いが結構重要になります。
区切り文字でスペースを使ったデータを元に解説します。
商品 単価 数量
A商品 500 1
B商品 1000 2
このデータは問題なく取得できました。
しかし、商品名にスペースが使われた商品タイトルがあった場合に、データ構造が破綻します。
4行目にPythonと本の間にスペースを入れたデータを追加します。
商品 単価 数量
A商品 500 1
B商品 1000 2
Python 本 1500 1
これを区切り文字で利用したコードで実行します。
import csv
with open('sample.csv') as f:
data = csv.reader(f, delimiter=' ') # 引数に区切り文字を設定
for line in data:
print(line)
結果は、下記の通りになります。
['商品', '単価', '数量']
['A商品', '500', '1']
['B商品', '1000', '2']
['Python', '本', '1500', '1']
Pythonと本が分割されて、単価の部分に本が指定されたデータなっているのがわかります。
このように「Python 本」とするために、引用符の設定をします。
readerの引用符のデフォルトがダブルクォーテーションなので、商品データのPythonと本をダブルクォーテーションで囲みます。
商品 単価 数量
A商品 500 1
B商品 1000 2
"Python 本" 1500 1
それでは、CSV読み込みコードで実行してみてください。
そうすると、下記のように「Python 本」として区切られたデータになります。
['商品', '単価', '数量']
['A商品', '500', '1']
['B商品', '1000', '2']
['Python 本', '1500', '1']
ダブルクォーテーション以外の引用符にするには、quotecharを引数にしていすることで、ダブルクォーテーション以外の文字にすることができます。
下記は、ダブルクォーテーションではなく、シングルクォーテーションに変更した例になります。
import csv
with open('sample.csv') as f:
data = csv.reader(f, delimiter=' ', quotechar="'")
for line in data:
print(line)
DictReaderの使い方
DictReaderを使うことで、CSVを辞書型のデータとして扱うことができます。
これは、CSVファイルのデータにヘッダー行があれば、そのデータを元に辞書型のデータを作ります。
読み込むデータは、引用符の取り扱いで使ったデータを使います。
import csv
with open('sample.csv') as f:
data = csv.DictReader(f, delimiter=' ')
for line in data:
print(line)
結果は下記になります。
{'商品': 'A商品', '単価': '500', '数量': '1'}
{'商品': 'B商品', '単価': '1000', '数量': '2'}
{'商品': 'Python 本', '単価': '1500', '数量': '1'}
1行目の商品、単価、数量がキーの値になって作成されていることがわかります。
疑問に思ったのですが、キーを日本語に設定すると読み込むことができるか?
実際試してみました。
import csv
with open('sample.csv') as f:
data = csv.DictReader(f, delimiter=' ')
for line in data:
print(line['商品'])
結果は、line['商品']とすることで商品名だけの表示が可能でした。
DictReaderでヘッダーがない場合の使い方
CSVにヘッダーがない場合は、作成することでDicReaderを辞書型として利用することができます。
試しに、下記のデータの1行目を削除します。
商品 単価 数量
A商品 500 1
B商品 1000 2
"Python 本" 1500 1
1行目を削除すると下記のデータになります。
A商品 500 1
B商品 1000 2
"Python 本" 1500 1
このデータを元に、DictReaderの読み込みコードを実行してみてください。
下記のように、データが壊れます。
{'A商品': 'B商品', '500': '1000', '1': '2'}
{'A商品': 'Python 本', '500': '1500', '1': '1'}
ヘッダーが無いと壊れるので、ヘッダーを作成します。
DictReaderの引数にfieldnamesを指定することで設定できます。
import csv
with open('sample.csv') as f:
header = ['商品名', '単価', '数量']
data = csv.DictReader(f, delimiter=' ', fieldnames=header)
for line in data:
print(line)
商品名、単価、数量がキーとして取得できるようになりました。
{'商品名': 'A商品', '単価': '500', '数量': '1'}
{'商品名': 'B商品', '単価': '1000', '数量': '2'}
{'商品名': 'Python 本', '単価': '1500', '数量': '1'}
CSVファイルの書き込み
CSVファイルの書き込みも、読み込み同様にopen関数を利用します。
モードの設定オプションもテキストの操作と同じく、wを使って新規作成や上書きを行います。
テキストとの違いは、CSVの読み込み同様にcsvをインポートしてwriter関数を使います。
import csv
with open('sample_write.csv', 'w') as f:
row = ['test', 'sample', 'csv']
w = csv.writer(f)
w.writerow(row)
結果は下記の通り、sample_writer.csvに保存されます。
test,sample,csv
これだと、1行ずつの登録になってしまうので一括して登録するには、writerows関数を使います。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
['test', 'sample', 'csv'],
['test2', 'sample2', 'csv2'],
]
w = csv.writer(f)
w.writerows(rows)
writerowをwriterowsに変更して、1次元配列を多次元配列に変更するだけで複数行の書き込みができます。
追記の仕方
追記をするには、open関数のモードにaオプションを指定します。
そうすることで、末尾に追加することができます。
import csv
with open('sample_write.csv', 'a') as f:
rows = [
['test3', 'sample3', 'csv3'],
]
w = csv.writer(f)
w.writerows(rows)
区切り文字の指定
読み込み同様に、区切り文字の設定をして追加することができます。
writer関数の引数に、delimiterを設定します。
そうすることで、区切り文字をスペースだったりタブなどに変更することができます。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
['test', 'sample', 'csv'],
]
w = csv.writer(f, delimiter=' ')
w.writerows(rows)
区切り文字の設定で注意しないといけないのが、ファイルの中を確認して同じ区切り文字を利用します。
そうしないと、データの読み込みが壊れます。
実際に、元のデータカンマで追加する値はスペースの区切り文字をした場合でもエラーは出ずに登録することが可能です。
下記の3行目がその状態になります。
test,sample,csv
test2,sample2,csv2
test3 sample3 csv3
引用符の取り扱い
CSVの読み込みでは、引用符を使うことでCSVデータを壊さないように読み込みましたが、書き込みでは自動で引用符がつきます。
デフォルトの引用符は、読み込み同様にダブルクォーテーションになります。
実際に、下記のコードを実行すると勝手にダブルクォーテーションの引用符がついて、データが壊れないように書き込まれます。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
['商品 テスト', 'sample', 'csv'],
]
w = csv.writer(f, delimiter=' ')
w.writerows(rows)
商品とテストの間にスペースを入れていますが、結果は引用符で括られています。
"商品 テスト" sample csv
ヘッダーを入れた書き方
ヘッダーを追加する機能がcsvに無いため、リストの先頭行に追加する方法しかありません。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
['商品名', '単価', '数量'],
['商品 テスト', 1000, 1],
]
w = csv.writer(f, delimiter=' ')
w.writerows(rows)
上記のように直接リストを追加するか、もしくはinsertを使って先頭のリストに追加する方法になります。
DictWriterの使い方
DictWriterの使い方は、DictRederとほとんど同じですがfieldnamesの引数を省略すことができません。
そのため、下記のように必ず設定する必要があります。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
{'商品名': 'テスト 商品', '単価': 1000, '数量': 1}
]
w = csv.DictWriter(f, delimiter=' ', fieldnames=['商品名', '単価', '数量'])
w.writerows(rows)
このコードを実行すると下記のようにファイルに書き込まれます。
"テスト 商品" 1000 1
ヘッダーが追加されてないと思った方もいると思います。
DictWriterでヘッダーを書き込むには、writeheader関数を使います。
import csv
with open('sample_write.csv', 'w') as f:
rows = [
{'商品名': 'テスト 商品', '単価': 1000, '数量': 1}
]
w = csv.DictWriter(f, delimiter=' ', fieldnames=['商品名', '単価', '数量'])
w.writeheader() # ここに追加
w.writerows(rows)
上記のコードのようにwriteheaderを追加することで、下記のようにファイルに書き込まれます。
商品名 単価 数量
"テスト 商品" 1000 1
まとめ
PythonでCSVを操作するには、標準のモジュールで問題なくカンタンに操作することができます。
使い方としては、テキストと同じ扱いでopenを行なって利用するため、テキストの使い方を覚えておけば問題なくCSVを操作することができます。
他にも、通常のreaderやwriterではなく、辞書型として使えるDictReaderやDictWriterはコードを書く上で有用性があります。
DictReaderやDictWriterは覚えておいて損はないです。
他にもPythonでいろいろなファイルの読み書きを解説しています。
ご興味があれば、下記の記事もご覧ください。
-
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...続きを見る
-
PythonでTEXTを操作!読み込みから書き込みまでの基本
Pythonを使ったテキストを操作するために、読み込みから書き込みといった使い方を解説します。 読み込みに関しては、1行ずつ読み込んだり読み込んだファイルをリスト化したりといった手法もサンプルコードを元に説明しています。 他にもPython ...続きを見る
今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?