Python

【Python】CSVの書き込み方法【誰でも簡単にできます】

【Python】CSVの書き込み方法【誰でも簡単にできます】

こんにちは。さすを(@sasuwo0409)です。

以前、6,000万のPython案件に携わった経験があります。

今回の記事は、Pythonを用いてCSVの書き込み方法を紹介していきます。

それでは本文をどうぞ。

困っている人
困っている人

PythonでCSVを読み込んだはいいもののどうやって書き込めばいいの、、

わかりやすく教えてほしい、、

さすを
さすを

これらの悩みを解決します!

この記事を読むとわかること:

  • pandasライブラリを使ってCSVを書き込む方法
  • NumPyライブラリを使ってCSVを書き込む方法
  • 改行を追加・消去してCSVを書き込む方法
  • 行と列を指定・追加してCSVを書き込む方法
  • 配列からCSVを書き込む方法
  • for文を使ってリストを1行ずつ書き込む方法
  • 文字化けの対処法
  • ヘッダーを追加してCSVを書き出す方法

筆者の情報:

  • 現役システムエンジニア 兼 副業ブロガー
  • 過去に6,000万のPython案件を受注

※0円のサンプルテキストという近道
独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストをもらえるので、これを使ってPythonの基礎を学ぶのもありだと思います。

>>techgymの無料サンプルテキストはこちらから

スポンサーリンク

1.【Python】CSVの書き込み方法

1.【Python】CSVの書き出し方法【pandasで簡単解決】

この記事で紹介しているフォルダ・ファイルの構成は以下のようになっています。

あくまで一例なので、あなたの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

今回書いているスクリプトはwrite_csv.pyです。
読み込んでいるdefault.csvは、csvフォルダの中に入っています。
そのほかのフォルダはpandas、NumPyをインストールした際に作られたものです。

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")

実行結果はこちらです。

図1:実行結果(1)
図1:実行結果(1)
図2:実行結果(2)
図2:実行結果(2)
#実行結果
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

注意:pythonスクリプトを実行する際は、pythonスクリプトの直下まで移動してから実行コマンドを打ってください。(上記の例では、デスクトップの中のPythonフォルダ)

補足:勝手に改行が挿入されることがある

洞察力が鋭い方は、気づいているかもしれませんが、今作成したファイルは読み込んだファイルと全く同じではありません。

疑問をもつ人
疑問をもつ人

どういうこと?

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

図3:異なるCSVファイル
図3:異なるCSVファイル
おどろく人
おどろく人

見た目は変わっていないように見えていたけど、よく見るとファイルの大きさが違う…!

中身を比較してみると最終行に改行が入っていることがわかります。

図4:ファイルの比較
図4:ファイルの比較

この最終行の改行を消したい場合は、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)
図5:同一のファイル
図5:同一のファイル
図6:同一ファイルの比較
図6:同一ファイルの比較
さすを
さすを

これで全く同じ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=",")

delimiter:ファイルの区切り文字。スペース区切りをしたい場合は「’ ‘」、タブ区切りをしたい場合は「’\t’」を入力すればOK。

さすを
さすを

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)

newline:改行コードの制御のオプション。デフォルトは「None」で入力中の行は「”\n”,”\r”」または「”\r\n”」とされ、呼び出し元に返される前に”\n”として扱われる。

出力ファイルの中身はこちらです。

1996年,24
2000年,20
1964年,56

上記のプログラムでCSVの改行コードをLFにしたい場合は、改行コードの指定の他に、CSV形式の指定をする必要があります。
改行コードをLFにしたい場合:

with open("csv/write_csv_box3.csv","w",newline="\n") as f:
    writer = csv.writer(f,delimiter=",",lineterminator="\n")

これで、改行コードをLFにすることができます。

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書籍のおすすめ8選

また、参考書と並行して、Pythonの学習をしていきたいという方は、Pythonを学べるおすすめ学習サイトを以下の記事で解説しているので、こちらも参考にしてみてください。

>>【料金別&徹底解説】 Pythonおすすめ勉強サイト8選【楽しく学ぼう】

スクール編

お金がかかってもいいから、少しでも早くPythonスキルを身につけたい方は、TechAcademy(テックアカデミー)のPythonコースがおすすめです。

エンジニアになれば、受講料は1か月もあれば回収できるので、問題なしです。

本気でPythonスキルを身につけたい方は、スクールで一気にスキルを身に着けるのもありでしょう。

>>TechAcademy(テックアカデミー)のPythonコースはこちら

おわりに

6,000万のPython案件に携わった経験のある筆者が、CSVの書き込み方法を紹介しました。

CSVの書き込みはPython開発で使用する頻度がかなり高いです。

わからない箇所があったら、何度でも読み返してスムーズに使えるようにしておきましょう。

この記事が少しでもあなたの役に立てていたらうれしいです。

頑張るあなたを応援しています!

それでは!

>>【Python】pandasライブラリを使ってCSVを読み込む方法

>>【徹底解説】Pythonエンジニアに転職する方法【失敗しない方法を詳しく解説】

>>【初心者向け】Python学習の始め方【現役エンジニアがわかりやすく解説】

コメント

  1. Python初心者 より:

    初めまして。
    「配列をCSVとして書き出す方法」の項でnewline=”\n”として
    サンプルを実行しても改行はLFにはならずCRLFになります。
    改行をLFにさせるためのTIPSを一言書き添えておくと親切かと思います。

    • さすをsasuwo より:

      Python初心者さん

      コメントありがとうございます。
      改行をLFにするための方法を追記しました。

      アドバイスいただきありがとうございました!

タイトルとURLをコピーしました