どーもTakeです。
今回は Python で CSV ファイルの読み込み(入力)と書き込み(出力)処理についてわかりやすく解説します!!
ファイルの読み込み(入力)処理はざっくり下記のようにすればOKです。
- csv モジュールをインポート!
- 「open」でファイルをオープン!
- csv.reader でファイルの中身を読み込む!
またファイルの書き込み(入力)処理はざっくり下記のようにすればOKです。
- csv モジュールをインポート!
- 「open」でファイルをオープン!
- csv.writeでファイルの中身を読み込む!
またこの記事ではCSVファイルの読み込み(入力)と書き込み(出力)処理をする際に発生しうる問題点についてもまとめます!
- ダブルクォーテーションも表示させたい!
- 日本語がうまく読み込めない!
- 区切り文字を「カンマ」ではなく「空白」にしたい!
- 既存ファイルに追記したい!
- 文字コード「UTF-8」で出力したい!
詳細については以下に記述します。
ぜひこの記事を読んで参考にしていただければ幸いです。
CSV ファイルの読み込み
まずは以下の内容の「test.csv」があるとします。
1 2 |
"1","2","3","4" "ABC","DEF","SSS" |
上記を読み込む際は、下記のようなソースコードを書きます。
1 2 3 4 5 6 |
import csv with open('test.csv') as csvfile: result = csv.reader(csvfile) for row in result: print(', '.join(row)) |
上記ソースコードについて下記にまとめます。
- 「import csv」と記述することで Python 標準の「csv」モジュールを記述します。
- 「open」をつかって「test.csv」を開き、「csv.reader」から CSV ファイルの中身を配列「result」に格納させます。
- 最後に for 文を用いて配列「result」の中身を表示させる
実行結果、下記のようになります。
1 2 |
1, 2, 3, 4 ABC, DEF, SSS |
ダブルクォーテーションも表示させたい!
実行結果を下記のようにダブルクォーテーション付きで表示させたい場合があると思います。
1 2 |
"1","2","3","4" "ABC","DEF","SSS" |
そんなときは、csv.reader に 「quotechar」をつけます。
これは文字を囲む特殊文字を何にするか指定できます。
ダブルクォーテーションで囲む場合は「quotechar='|'」でできます。
1 2 3 4 5 6 |
import csv with open('test.csv') as csvfile: result = csv.reader(csvfile,quotechar='|') for row in result: print(', '.join(row)) |
日本語がうまく読み込めない!
例えば、以下のような「日本語」を含む CSV ファイルがあるとします。
1 2 3 |
"1","2","3","4" "ABC","DEF","SSS" "あいうえお","かきくけこ","さしすせそ" |
これを下記のソースコードで読み込もうとすると旨く読み込めない場合があると思います。
1 2 3 4 5 6 |
import csv with open('test.csv') as csvfile: result = csv.reader(csvfile) for row in result: print(', '.join(row)) |
つまりこんな感じ↓のエラーが表示されませんか?
1 |
<span class="ansi-red-intense-fg ansi-bold">UnicodeDecodeError</span>: 'cp932' codec can't decode byte 0x86 in position 45: illegal multibyte sequence |
これは CSV ファイルを読み込む際に文字コードを指定しなかったため、うまく読み込めなかったことが原因です。
そんなときは、「open」をする際に「encoding="utf-8"」を指定することで読み込むことが可能です。
1 2 3 4 5 6 |
import csv with open('test.csv',encoding="utf-8") as csvfile: result = csv.reader(csvfile) for row in result: print(', '.join(row)) |
下記が実行結果です。うまく読み込めてますね!
1 2 3 |
1, 2, 3, 4 ABC, DEF, SSS あいうえお, かきくけこ, さしすせそ |
※ 今回はCSVファイルが「UTF-8」だったので読み込めましたが、ファイルの文字コードに合わせて値を変える必要があります!
CSV ファイルの出力処理
CSVファイルへの出力処理は以下のようなソースコードで実現できます。
1 2 3 4 5 6 7 |
import csv with open('test2.csv', 'w', newline='') as csvfile: write = csv.writer(csvfile) write.writerow(['1', '2', '3']) write.writerow(['ABC', 'XYZ', 'QWE']) write.writerow(['あいうえお', 'かきくけこ', 'さしすせそ']) |
上記ソースコードについて下記にまとめます。
- 「import csv」と記述することで Python 標準の「csv」モジュールを記述します。
- 「open」をつかって「test2.csv」を書き込みモードで開き、「csv.writer」から 「write」へ書き込む際の情報を格納させます。
- write.writerow で書き込みます。
区切り文字を「カンマ(,)」ではなく「空白」にしたい!
区切り文字をカンマから空白にしたい場合、csv.writer の delimiter = ' ' と指定することで実現できます。
具体的には下記のようなソースコードでできます。
1 2 3 4 5 6 7 |
import csv with open('test2.csv', 'w', newline='') as csvfile: write = csv.writer(csvfile delimiter=' ') write.writerow(['1', '2', '3']) write.writerow(['ABC', 'XYZ', 'QWE']) write.writerow(['あいうえお', 'かきくけこ', 'さしすせそ']) |
既存ファイルに追記したい!
既存ファイルに追記する場合、openで「w」と指定する箇所を「a」と指定します。
1 2 3 4 5 6 7 |
import csv with open('test2.csv', 'a', newline='',encoding="utf-8") as csvfile: write = csv.writer(csvfile, delimiter=' ') write.writerow(['1', '2', '3']) write.writerow(['ABC', 'XYZ', 'QWE']) write.writerow(['あいうえお', 'かきくけこ', 'さしすせそ']) |
実行結果、以下のように追記されていることが確認できます。
1 2 3 4 5 6 |
1 2 3 ABC XYZ QWE あいうえお かきくけこ さしすせそ 1 2 3 ABC XYZ QWE あいうえお かきくけこ さしすせそ |
文字コード「UTF-8」で出力したい!
出力ファイルを文字コードを指定して出力させたい場合があると思います。
そんなときは「open」に 「encoding="utf-8"」を指定します。
1 2 3 4 5 6 7 |
import csv with open('test2.csv', 'w', newline='',encoding="utf-8") as csvfile: write = csv.writer(csvfile, delimiter=' ') write.writerow(['1', '2', '3']) write.writerow(['ABC', 'XYZ', 'QWE']) write.writerow(['あいうえお', 'かきくけこ', 'さしすせそ']) |
最後に
いかがでしたでしょうか?
Python で CSV ファイルの読み込み(入力)と書き込み(出力)処理について解説しました。
この記事が参考になれば幸いです。
ではでは。