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 |
力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。