こんにちは。さすを(@sasuwo0409)です。
以前、6,000万のPython案件に携わった経験があります。
今回の記事は、Pythonを用いてCSVの書き込み方法を紹介していきます。
それでは本文をどうぞ。

PythonでCSVを読み込んだはいいもののどうやって書き込めばいいの、、
わかりやすく教えてほしい、、

これらの悩みを解決します!
※0円のサンプルテキストという近道
独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストと解説動画をもらえるので、これを使ってお得にPythonの基礎を学ぶのもオススメです。
最短1分でできる!
1.【Python】CSVの書き込み方法

この記事で紹介しているフォルダ・ファイルの構成は以下のようになっています。
あくまで一例なので、あなたのPC状況にあわせてパスは変更してください。
Python(フォルダ)
-----write_csv.py(これから作成するプログラム)
-----csv(フォルダ)
----------default.csv(読み込むCSV)
-----__pycache__
-----bin
-----dateutil
-----numpy
-----numpy-1.21.4.dist-info
-----pandas
-----pandas-1.3.5.dist-info
-----python_dateutil-2.8.2.dist-info
-----pytz
-----pytz-2021.3.dist-info
-----six-1.16.0.dist-info
-----six.py
pandasを使う方法
今回は、以下のCSV(default.csv)を読み込む想定でいきます。
Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange
pandasライブラリを使ってCSVを書き込む方法は以下の通りです。
#pandasをインポート
import pandas as pd
#CSVをインポート
import csv
#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)
#dfをPythonフォルダの中のcsvフォルダに出力
df.to_csv("csv/default_output.csv")
実行結果はこちらです。


#実行結果
Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange
なお、データを追加したい場合は、以下のようにプログラムを書けばOKです。
#pandasをインポート
import pandas as pd
#CSVをインポート
import csv
#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)
#ファイル追記
#行方向の場合
df.loc['4'] = ['July','peach']
#列方向の場合
df['num'] = [0,1,2,3]
#dfをPythonフォルダの中のcsvフォルダに出力
df.to_csv("csv/default_output.csv")
#実行結果
Number,Month,Fruit,num
1,Aplil,apple,0
2,Jun,grape,1
3,December,orange,2
4,July,peach,3
補足:勝手に改行が挿入されることがある
洞察力が鋭い方は、気づいているかもしれませんが、今作成したファイルは読み込んだファイルと全く同じではありません。

どういうこと?
実は、見た目は同じですが、改行が含まれているのです。


見た目は変わっていないように見えていたけど、よく見るとファイルの大きさが違う…!
中身を比較してみると最終行に改行が入っていることがわかります。

この最終行の改行を消したい場合は、default_output.csvの中身を下記のように変更すればOKです。
#pandasをインポート
import pandas as pd
#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)
#dfをCSV出力
df.to_csv("csv/default_output.csv")
#作成したdefault_output.csvを読み込み最終行の改行コードを無くす処理
with open("csv/default_output.csv") as f:
lines = f.readlines()
last = len(lines)-1
lines[last] = lines[last].replace("\r","").replace("\n","")
#default_output.csvを上書きする処理
with open("csv/default_output.csv","w") as f:
f.writelines(lines)



これで全く同じCSVファイルを出力することができました!
NumPyを使う方法
今回CSV読み込みに使用したファイルはこちらです。
1,24,1996
2,23,1997
3,38,1982
4,7,2013
5,73,1947
そして、NumPyライブラリを使ってCSVを書き出す方法は下記の通りです。
#numpyをインポート
import numpy as np
#CSVを読み込みdataに代入(delimiter:ファイルの区切り文字)
data = np.loadtxt("csv/numpy_read.csv",delimiter=",")
#numpy_write.csvという名前でcsvフォルダに出力
np.savetxt("csv/numpy_write.csv",X=data,delimiter=",")

NumPyは数値計算を効率的に行うことができるライブラリなので、基本的に数値のみのデータを扱います。
文字列など、数値以外のデータを扱いたい場合は、上記で上げたpandasを使うことが多いです。
実行結果はこちらです。
1.000000000000000000e+00,2.400000000000000000e+01,1.996000000000000000e+03
2.000000000000000000e+00,2.300000000000000000e+01,1.997000000000000000e+03
3.000000000000000000e+00,3.800000000000000000e+01,1.982000000000000000e+03
4.000000000000000000e+00,7.000000000000000000e+00,2.013000000000000000e+03
5.000000000000000000e+00,7.300000000000000000e+01,1.947000000000000000e+03
デフォルトでは少数第18位まで出力されます。
もし、整数で出力したいのであれば、プログラムの最終行に、以下のようなオプションを追記すればOKです。
np.savetxt("csv/numpy_write.csv",X=data,delimiter=",",fmt="%.0f")
#実行結果
1,24,1996
2,23,1997
3,38,1982
4,7,2013
5,73,1947
データを追加したい場合は、以下のようにプログラムを書けばOKです。
#numpyをインポート
import numpy as np
#CSVを読み込みdataに代入(delimiter:ファイルの区切り文字)
data = np.loadtxt("csv/numpy_read.csv",delimiter=",")
#ファイル追記
#行方向の場合
data = np.insert(data,3,50,axis=0)
#列方向の場合
data = np.insert(data,3,100,axis=1)
#numpy_write.csvという名前でcsvフォルダに出力
np.savetxt("csv/numpy_write.csv",X=data,delimiter=",",fmt="%.0f")
#実行結果
1,24,1996,100
2,23,1997,100
3,38,1982,100
50,50,50,100
4,7,2013,100
5,73,1947,100
行・列を指定する方法
CSVの行・列を指定して書き出す方法は下記の通りです。
#pandasをインポート
import pandas as pd
#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv")
#行を抽出したい場合
#書き出す行名を指定(例:1行目から3行目)
#df = df[1:3]
#df.to_csv("csv/default_output.csv",index=None)
#列を抽出したい場合
#dfをPythonフォルダの中のcsvフォルダに出力
#columnsオプションで書き出す列名を指定
#indexオプションで、行番号を削除
df.to_csv("csv/default_output.csv",columns=["Number","Fruit"],index=None)
出力ファイルの中身はこちらです。
#行抽出の実行結果
Number,Month,Fruit
2,Jun,grape
3,December,orange
#列抽出の実行結果
Number,Fruit
1,apple
2,grape
3,orange
配列をCSVとして書き込む方法
配列をCSVとして書き出す方法は下記の通りです。
#CSVをインポート
import csv
#今回使用する配列の作成
box = [("1996年",24),("2000年",20),("1964年",56)]
#CSVの書き出し(w:ファイルの上書きを指定、newline:改行コードを指定)
with open("csv/write_csv_box.csv","w",newline="\n") as f:
writer = csv.writer(f,delimiter=",")
writer.writerows(box)
出力ファイルの中身はこちらです。
1996年,24
2000年,20
1964年,56
for文を使ってリストを1行ずつ書き込む方法
for文を使ってリストを1行ずつ書き込む方法は下記の通りです。
#CSVをインポート
import csv
list = [["Aplil", "apple"],["Jun", "grape"],["December","orange"]]
#CSVを読み込み、dfに代入
with open('csv/default_output.csv', 'w', newline='') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
# headerの設定
writer.writerow(['Month', 'Fruit'])
for data in list:
writer.writerow(data)
出力ファイルの中身はこちらです。
Month,Fruit
Aplil,apple
Jun,grape
December,orange
文字化けの対処法
書き込んだCSVが文字化けしてしまうときは、文字コードを指定する必要があります。
下記のように文字コードを指定することで、文字化けを解消することができます。
#pandasをインポート
import pandas as pd
df = pd.read_csv("csv/default.csv",encoding="shift-jis")

メモ帳で開いたときは文字化けしなくても、エクセルで開くと文字化けしてしまうことがあるので注意が必要です!
ファイル名の指定方法
これまでも使用していましたが、PythonのCSVのファイル名を指定した書き出し方法は下記の通りです。
pandasを使用する場合:
#pandasをインポート
import pandas as pd
#CSVを読み込み(読み込みたいCSVのパスを指定)、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)
#df.to_csvの括弧内にファイル名を記入する
df.to_csv("csv/default_output.csv")
NumPyを使用する場合:
#numpyをインポート
import numpy as np
#CSVを読み込み(読み込みたいCSVのパスを指定)、dataに代入
data = np.loadtxt("csv/numpy_read.csv",delimiter=",")
#np.savetxtの括弧内の最初にファイル名を記入する
np.savetxt("csv/numpy_write.csv",X=data,delimiter=",")

数値計算をしたいとき以外はpandasを使う方が簡単なのでおすすめです!
ヘッダーを追加する方法
Pythonでヘッダーを追加してCSVを書き出す方法は下記の通りです。
#pandasをインポート
import pandas as pd
#CSVをインポート
import csv
#読み込んだCSVを配列にしてdfに代入
df = pd.read_csv("csv/default.csv",header=None).values.tolist()
#CSVを読み込み、dfに代入
with open('csv/default_output.csv', 'w',newline='') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
# header を設定
writer.writerow(['row_1', 'row_2', 'row_3'])
writer.writerows(df)
出力結果はこちらです。
row_1,row_2,row_3
Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange

「読み込む → 書き込む → 出力する」の順に作成すればOKです!
2.Pythonスキルをさらに伸ばすために
独学編
Pythonスキルを独学で身に着けるためには、参考書が必須です。
おすすめのPython書籍は以下の記事で解説しているので、参考にしていただけたらと思います。
また、参考書と並行して、Pythonの学習をしていきたいという方は、Pythonを学べるおすすめ学習サイトを以下の記事で解説しているので、こちらも参考にしてみてください。
>>【料金別&徹底解説】 Pythonおすすめ勉強サイト8選【楽しく学ぼう】
スクール編
お金がかかってもいいから、少しでも早くPythonスキルを身につけたい方は、TechAcademy(テックアカデミー)のPythonコースがおすすめです。
エンジニアになれば、受講料は1か月もあれば回収できるので、問題なしです。
本気でPythonスキルを身につけたい方は、スクールで一気にスキルを身に着けるのもありでしょう。
>>TechAcademy(テックアカデミー)のPythonコースはこちら
おわりに
6,000万のPython案件に携わった経験のある筆者が、CSVの書き込み方法を紹介しました。
CSVの書き込みはPython開発で使用する頻度がかなり高いです。
わからない箇所があったら、何度でも読み返してスムーズに使えるようにしておきましょう。
この記事が少しでもあなたの役に立てていたらうれしいです。
頑張るあなたを応援しています!
それでは!
最短1分でできる!
>>【Python】pandasライブラリを使ってCSVを読み込む方法
コメント
初めまして。
「配列をCSVとして書き出す方法」の項でnewline=”\n”として
サンプルを実行しても改行はLFにはならずCRLFになります。
改行をLFにさせるためのTIPSを一言書き添えておくと親切かと思います。
Python初心者さん
コメントありがとうございます。
改行をLFにするための方法を追記しました。
アドバイスいただきありがとうございました!