採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

L09 ch03 — CSV ファイル

テクノロジ系 / L09 file-io — ファイル永続化

L09 ch03 — CSV ファイル

業務でよく使う CSV を辞書として扱う

ゴール

  • csv.DictReader で辞書として読む
  • csv.DictWriter で辞書を書く
  • 型変換 (CSV は全て文字列) を意識する

書き込み (DictWriter)

import csv

tasks = [
    {"id": 1, "title": "買い物", "done": False},
    {"id": 2, "title": "掃除", "done": True},
]

with open("tasks.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["id", "title", "done"])
    writer.writeheader()
    writer.writerows(tasks)

読み込み (DictReader)

with open("tasks.csv", encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)
    tasks = list(reader)

print(tasks)
# [{'id': '1', 'title': '買い物', 'done': 'False'}, ...]

罠: 型が全部 str

# CSV で読むと
{"id": "1", "done": "False"}    # 全部文字列!

# 数値・bool に変換が必要
for row in reader:
    row["id"] = int(row["id"])
    row["done"] = row["done"] == "True"

BOM 対応 (Excel CSV)

Excel が出力する CSV は BOM 付き UTF-8 (先頭に \xEF\xBB\xBF):

# ✅ utf-8-sig で自動除去
with open("excel.csv", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)

newline="" の意味

# Windows で改行が "\r\n" にされて 二重改行になるバグ防止
with open(path, "w", newline="") as f:  # ← 必須
    writer = csv.writer(f)

drill

drill/ — CSV から DictReader で読み、型変換

業務での典型用途

用途サンプル
日次レポート出力DB → CSV (Excel で開ける形式)
取引先からのデータ取り込みCSV → DB / API
設定マスタ担当者リスト / 商品マスタを CSV で配布
ログ集約アクセスログを CSV にして集計しやすく

DictReader vs reader (= 添字 vs キー)

# DictReader (= キーアクセス / 推奨)
for row in csv.DictReader(f):
    print(row["title"])

# reader (= 添字アクセス / 簡素だが脆い)
for row in csv.reader(f):
    print(row[1])      # ← 列順が変わると壊れる

> ヘッダ列順が変わる可能性がある CSV は DictReader 必須。

エラー処理の典型

import csv
from pathlib import Path

def load_tasks(path: Path) -> list[dict]:
    if not path.exists():
        return []
    try:
        with path.open(encoding="utf-8-sig", newline="") as f:
            return list(csv.DictReader(f))
    except UnicodeDecodeError:
        # cp932 (= Shift_JIS) の場合の fallback
        with path.open(encoding="cp932", newline="") as f:
            return list(csv.DictReader(f))

次に学ぶ領域

領域続けて読む
業務データ操作 (フィルタ・集計)ch04-pandas
JSON 永続化ch02-json
環境変数ch05-dotenv
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。