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

【Python】CSVの書き出し方法【誰でも簡単にできます】プログラミング

こんにちは。さすをです。

以前、6,000万のPython案件に携わりました。

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

それでは本文をどうぞ。

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

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

CSVで書き出しをしたい女性
CSVで書き出しをしたい女性
さすを
さすを

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

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

・pandas、numpyライブラリを使ってCSVを書き出す方法

・改行を消してCSVを書き出す方法

・列を指定、追加してCSVを書き出す方法

・配列からCSVを書き出す方法

・文字化けの対処法

・ヘッダーを追加してCSVを書き出す方法

筆者の情報:

・現役システムエンジニア 兼 副業ブロガー

・過去に6,000万のPython案件を受注

pandasライブラリをまだインストールしていない方は、【これだけ知っておけばOKです】 現役エンジニアもよく使う便利なPythonライブラリ22選から、インストールしてください。

スポンサーリンク

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

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

例として読み込む使用するCSV(default.csv)はこちらです。

Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange

なお、フォルダ構成は以下のようになっています。

状況によってパスは変更してください。

図1 フォルダ構成
図1 フォルダ構成

読み込むCSVフォルダの中身はこちら。

図2 csvフォルダ構成
図2 csvフォルダ構成

今回書いているスクリプトはwrite_csv.pyです。

読み込んでいるdefault.csvは、csvフォルダの中に入っています。

そのほかのフォルダはpandasをインストールした際に作られたものです。

そして、pandasライブラリを使ってCSVを書き出す方法は下記の通りです。

#pandasをインポート
import pandas as pd

#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)

#dfをPythonフォルダの中のcsvフォルダにCSV出力
df.to_csv("csv/default_output.csv")

実行結果は下記の通り。

図3 実行スクリプト
図3 実行コマンド
図4 実行結果
図4 実行結果
Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange
さすを
さすを

指定したフォルダにCSVが作られていることがわかりますね!

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

2.【Python】CSVの書き出し方法【改行の消し方】

2.【Python】CSVの書き出し方法【改行の消し方】

洞察力が鋭い方は、気づいているかもしれませんが、『1.【Python】CSVの書き出し方法【pandasで簡単解決】』のファイルは読み込んだファイルと全く同じではありません。

どういうこと?

疑問を抱く女性
疑問を抱く女性

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

図5 異なる2ファイル
図5 異なる2ファイル

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

驚きを隠せない女性
驚きを隠せない女性

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

図6 ファイルの比較
図6 ファイルの比較

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

これで全く同じCSVファイルを出力することができました!

3.【Python】CSVの書き出し方法【numpy】

3.【Python】CSVの書き出し方法【numpy】

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

なお、今回CSV読み込みに使用したファイルはこちら。

#ファイル名は自由(拡張子はcsv)
1,24,1996
2,23,1997
3,38,1982
4,7,2013
5,73,1947
さすを
さすを

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位まで出力されます。

整数で出力したい場合は、

np.savetxt("csv/numpy_write.csv",X=data,delimiter=",")

に以下のようなオプションを追記すればOKです。

np.savetxt("csv/numpy_write.csv",X=data,delimiter=",",fmt="%.0f")

4.【Python】CSVの書き出し方法【列の指定】

4.【Python】CSVの書き出し方法【列の指定】

CSVの列を指定して書き出す方法は下記の通りです。

#pandasをインポート
import pandas as pd

#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv")

#dfをPythonフォルダの中のcsvフォルダにCSV出力
#columnsオプションで書き出す列名を指定
#indexオプションで、行番号を削除
df.to_csv("csv/default_output.csv",columns=["Number","Fruit"],index=None)

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

Number,Fruit
1,apple
2,grape
3,orange

5.【Python】CSVの書き出し方法【配列からCSV出力】

5.【Python】CSVの書き出し方法【配列から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

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

改行コードをLFにしたい場合:

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

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

6.【Python】CSVの書き出し方法【文字化け】

6.【Python】CSVの書き出し方法【文字化け】

書き込んだCSVが文字化けしてしまうときは、文字コードを指定する必要があります。

下記のように文字コードを指定することで、文字化けを解消することができます。

import pandas as pd
 
df = pd.read_csv("csv/default.csv",encoding="shift-jis")
さすを
さすを

メモ帳で開いたときは文字化けしなくても、エクセルで開くと文字化けしてしまうことがあるので注意が必要です!

7.【Python】CSVの書き出し方法【ファイル名の指定】

7.【Python】CSVの書き出し方法【ファイル名の指定】

上記の項目でも使用していましたが、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を使う方が簡単なのでおすすめです!

8.【Python】CSVの書き出し方法【列の追加】

8.【Python】CSVの書き出し方法【列の追加】

Pythonで列を追加してCSVを書き出す方法は下記の通りです。

#pandasをインポート
import pandas as pd

#CSVを読み込み、dfに代入
df = pd.read_csv("csv/default.csv",index_col=0)

#列(color)を追加
df["color"] = ["red","purple","orange"]

#dfをPythonフォルダの中のcsvフォルダにCSV出力
df.to_csv("csv/default_output.csv")

出力結果は下記の通り。

Number,Month,Fruit,color
1,Aplil,apple,red
2,Jun,grape,purple
3,December,orange,orange

9.【Python】CSVの書き出し方法【ヘッダーの追加】

9.【Python】CSVの書き出し方法【ヘッダーの追加】

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') as csv_file:
    writer = csv.writer(csv_file, delimiter=',')
    # header を設定
    writer.writerow(['row_1', 'row_2', 'row_3'])
    writer.writerows(df)

#作成したdefault_output.csvを読み込み改行コードのみの行を無くす処理
with open("csv/default_output.csv") as f:
    lines = f.readlines()
    for line in range(len(lines)):
        if lines[line] == ("\n" or "\r"):
            lines[line] = lines[line].replace("\r","").replace("\n","")
        
#default_output.csvを上書きする処理
with open("csv/default_output.csv","w") as f:
    f.writelines(lines)

出力結果は下記の通り。

row_1,row_2,row_3
Number,Month,Fruit
1,Aplil,apple
2,Jun,grape
3,December,orange
さすを
さすを

「読み込む → 書き込む → 整形する → 出力する」の順に作成すればOKです!

10.まとめ

10.まとめ

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

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

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

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

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

それでは!

コメント

  1. Python初心者 より:

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

    • sasuwo より:

      Python初心者さん

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

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

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