概要
csvモジュールを使用してファイルを読み書きする方法についてまとめた。
前提としてファイルオブジェクトの操作が必要になる。
概要 open関数を使用してファイルの読み書きを行う方法について紹介する。 ファイル操作まわりの前提 以下のディレクトリ構造でjupyter-labを使用している。 […]
概要
osモジュールを使用すると、とOSに依存する機能を可能な限り同一の書き方で同一の機能を利用可能。OSに依存するケースとしては例えば以下がある。
・Windows:'\'・Linux:'/'
上記のよう[…]
前提(ファイル構成)
実行したファイル構成は以下となる。
│ 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と各キーが同じ値でないとエラーになってしまうため注意。