
どーも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 ファイルの読み込み(入力)と書き込み(出力)処理について解説しました。
この記事が参考になれば幸いです。
ではでは。

