【csv】Pythonでファイル操作:csvモジュールの基本的な使用方法

概要

csvモジュールを使用してファイルを読み書きする方法についてまとめた。
前提としてファイルオブジェクトの操作が必要になる。

あわせて読みたい

概要 open関数を使用してファイルの読み書きを行う方法について紹介する。   ファイル操作まわりの前提 以下のディレクトリ構造でjupyter-labを使用している。 […]

【open】Pythonでファイル操作:openモジュールの基本的な使用方法

あわせて読みたい

概要 osモジュールを使用すると、とOSに依存する機能を可能な限り同一の書き方で同一の機能を利用可能。OSに依存するケースとしては例えば以下がある。 ・Windows:'\'・Linux:'/' 上記のよう[…]

【os】Pythonでファイル操作:osモジュールの基本的な使用方法

 

前提(ファイル構成)

実行したファイル構成は以下となる。

│ about_csv.ipynb ⇒実行ファイル

├─input ⇒読み込み用CSVファイル格納フォルダ
│   payment.csv
│   points.csv

└─output ⇒書き込み用CSVファイル格納フォルダ
    sample.csv

 

payment.csv


2022/01/12,からあげ定食,食費,965
2022/01/13,帽子,衣服,658
2022/01/13,やきそば,食費,1368
2022/01/14,からあげ定食,食費,128

 

points.csv


名前,国語,算数,理科,社会
木村,57,28,42,40
鈴木,64,44,25,24
高橋,61,37,84,92
田中,41,90,41,51

 

 

csvモジュールの使い方

csvモジュールのインポート

csvモジュールをインポートすればcsvまわりの機能について使用可能。


import csv

 

ファイルの読み込み

csv.reader()

csv.reader()を使用することで、ファイルオブジェクトの中身を読み込むことができる。
csv.readerオブジェクトを作成し、for文でループすればCSVファイルの一行をリストで取得可能。


import csv 
import os 

path = os.path.join("input", "points.csv") 
with open(path, encoding="utf-8") as f: 
    # csv.readerオブジェクト取得 
    reader = csv.reader(f) 
    for row in reader: 
        print(row) 
# -------------------------------------- 
# 出力 
#['名前', '国語', '算数', '理科', '社会'] 
#['木村', '57', '28', '42', '40'] 
#['鈴木', '64', '44', '25', '24'] 
#['高橋', '61', '37', '84', '92'] 
#['田中', '41', '90', '41', '51']

 

csv.DictReader()

csv.DictReader()を使用すると、CSVファイルを辞書型で取得可能。
キーはヘッダーの値となるため、CSVのヘッダーを定義しないと変なデータができあがる

CSVのヘッダー有の場合

import csv
import os

path = os.path.join("input", "points.csv")
with open(path, encoding="utf-8") as f:
    # 各要素が辞書型のcsv.DictReaderオブジェクトを取得
    reader = csv.DictReader(f)
    for row in reader:
        print(row)
# --------------------------------------
# 出力
#{'名前': '木村', '国語': '57', '算数': '28', '理科': '42', '社会': '40'}
#{'名前': '鈴木', '国語': '64', '算数': '44', '理科': '25', '社会': '24'}
#{'名前': '高橋', '国語': '61', '算数': '37', '理科': '84', '社会': '92'}
#{'名前': '田中', '国語': '41', '算数': '90', '理科': '41', '社会': '51'}

 

CSVのヘッダー無の場合

CSVファイルのヘッダーがない場合、別途定義する必要あり。
定義していないと一行目のデータをヘッダーとみなされてしまう。


import csv
import os

path = os.path.join("input", "payment.csv")
with open(path, encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)
# --------------------------------------
# 出力
#{'2022/01/12': '2022/01/13', 'からあげ定食': '帽子', '食費': '衣服', '965': '658'}
#{'2022/01/12': '2022/01/13', 'からあげ定食': 'やきそば', '食費': '食費', '965': '1368'}
#{'2022/01/12': '2022/01/14', 'からあげ定食': 'からあげ定食', '食費': '食費', '965': '128'}

 

fieldnamesにヘッダーを定義

ヘッダーを定義するにはfieldnamesにヘッダー要素となるリストを指定する。
ヘッダーを読み取り処理で定義することで、ヘッダーがないCSVでも正しくデータを取得できる。


import csv
import os

path = os.path.join("input", "payment.csv")
with open(path, encoding="utf-8") as f:
    reader = csv.DictReader(f, fieldnames=["日付", "商品", "カテゴリ", "値段"])
    for row in reader:
        print(row)
# --------------------------------------
# 出力
#{'日付': '2022/01/12', '商品': 'からあげ定食', 'カテゴリ': '食費', '値段': '965'}
#{'日付': '2022/01/13', '商品': '帽子', 'カテゴリ': '衣服', '値段': '658'}
#{'日付': '2022/01/13', '商品': 'やきそば', 'カテゴリ': '食費', '値段': '1368'}
#{'日付': '2022/01/14', '商品': 'からあげ定食', 'カテゴリ': '食費', '値段': '128'}

 

fieldnamesという変数自体は以下のように省略可能。
ファイルオブジェクトの後に、ヘッダーとなるリストを設定している。


import csv
import os

path = os.path.join("input", "payment.csv")
with open(path, encoding="utf-8") as f:
    reader = csv.DictReader(f, ["日付", "商品", "カテゴリ", "値段"])
    for row in reader:
        print(row)
# --------------------------------------
# 出力
#{'日付': '2022/01/12', '商品': 'からあげ定食', 'カテゴリ': '食費', '値段': '965'}
#{'日付': '2022/01/13', '商品': '帽子', 'カテゴリ': '衣服', '値段': '658'}
#{'日付': '2022/01/13', '商品': 'やきそば', 'カテゴリ': '食費', '値段': '1368'}
#{'日付': '2022/01/14', '商品': 'からあげ定食', 'カテゴリ': '食費', '値段': '128'}

 

ファイルの書き込み

csv.writer

csv.writer()を使用することで、CSVファイル書き込み用のオブジェクトを取得することができる。

writerow()

writerow()を呼び出して、一行に書き込みたいリストを設定することでCSVファイルに書き込むことが可能。
尚、ファイルオブジェクトは“w”(書き込みモード)で開いている。
モードについては書き込みたいモードに合わせて実行すること。


import csv
import os

contents = [
    ["2023/6/12", "ノート", "150"],
    ["2023/6/13", "えんぴつ", "80"],
    ["2023/6/14", "消しゴム", "100"]
]
path = os.path.join("output", "sample.csv")
with open(path, "w", encoding="utf-8") as f:
    writer = csv.writer(f)
    for content in contents:
        writer.writerow(content)
# --------------------------------------
# 結果
#2023/6/12,ノート,150

#2023/6/13,えんぴつ,80

#2023/6/14,消しゴム,100

普通に書き込むと空行が入ってしまう。
そのため、空行を削除する設定を追加する必要がある。

open()を使用時、「newline=””」を設定することで空行を防ぐことが可能


import csv
import os

contents = [
    ["2023/6/12", "ノート", "150"],
    ["2023/6/13", "えんぴつ", "80"],
    ["2023/6/14", "消しゴム", "100"]
]
path = os.path.join("output", "sample.csv")
with open(path, "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    for content in contents:
        writer.writerow(content)

# --------------------------------------
# 結果
#2023/6/12,ノート,150
#2023/6/13,えんぴつ,80
#2023/6/14,消しゴム,100

 

もしヘッダーを入れたい場合、以下のように別途ヘッダーを書き込む必要がある。


import csv
import os

header = ["日付","商品","値段"]
contents = [
    ["2023/6/12", "ノート", "150"],
    ["2023/6/13", "えんぴつ", "80"],
    ["2023/6/14", "消しゴム", "100"]
]
path = os.path.join("output", "sample.csv")
with open(path, "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    # ヘッダー行だけ最初に書き込む
    writer.writerow(header)
    for content in contents:
        writer.writerow(content)

# --------------------------------------
# 結果
#日付,商品,値段
#2023/6/12,ノート,150
#2023/6/13,えんぴつ,80
#2023/6/14,消しゴム,100

csv.DictWriter()

csv.DictWriter()を使用することで、辞書型のデータを書き込むためのオブジェクトを取得することができる。
尚、書き込む際にはcsv.writer()と同様にwriterow()を使用する。


import csv
import os

header = ["日付","商品","値段"]
contents = [
    {'日付': '2023/6/12', '商品': 'ノート', '値段': '150'}, 
    {'日付': '2023/6/13', '商品': 'えんぴつ', '値段': '80'},
    {'日付': '2023/6/14', '商品': '消しゴム', '値段': '100'}
]
path = os.path.join("output", "sample.csv")
with open(path, "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, header)
    writer.writeheader()
    for content in contents:
        writer.writerow(content)
# --------------------------------------
# 結果
#日付,商品,値段
#2023/6/12,ノート,150
#2023/6/13,えんぴつ,80
#2023/6/14,消しゴム,100

ポイントとなるのはcsv.DictWriterオブジェクトを取得する際にheaderを設定していること
headerを設定することで、writeheader()によりヘッダーを出力可能。

また、書き込む対象の辞書データについては、設定したheaderと各キーが同じ値でないとエラーになってしまうため注意

スポンサーリンク