MeWrite Docs

KeyError: 'key'

辞書に存在しないキーにアクセスした場合に発生するエラー

概要

KeyError は、辞書(dict)に存在しないキーにアクセスしようとした場合に発生するエラーです。辞書のキー存在確認やデフォルト値の設定で解決できます。

エラーメッセージ

Traceback (most recent call last):
  File "script.py", line 3, in <module>
    value = data["missing_key"]
KeyError: 'missing_key'

原因

  1. 存在しないキーへのアクセス: 辞書にないキーを参照
  2. キーのタイプミス: キー名のスペルミス
  3. 大文字小文字の違い: "Name""name" は別のキー
  4. キーの型の違い: 1"1" は別のキー

解決策

1. get() メソッドを使用

1
2
3
4
5
6
7
8
data = {"name": "Alice", "age": 30}

# ❌ KeyError が発生
value = data["email"]

# ✅ デフォルト値を返す(Noneまたは指定値)
value = data.get("email")  # None
value = data.get("email", "unknown")  # "unknown"

2. in 演算子でキー存在確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
data = {"name": "Alice", "age": 30}

# ❌ KeyError が発生する可能性
if data["active"]:
    print("Active")

# ✅ キーの存在を確認
if "active" in data:
    if data["active"]:
        print("Active")

# ✅ get() と組み合わせ
if data.get("active", False):
    print("Active")

3. setdefault() でデフォルト値を設定

1
2
3
4
5
data = {"name": "Alice"}

# キーがなければデフォルト値を設定して返す
email = data.setdefault("email", "unknown@example.com")
print(data)  # {"name": "Alice", "email": "unknown@example.com"}

4. try-except で例外処理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
data = {"name": "Alice"}

try:
    value = data["email"]
except KeyError:
    value = "default"

# または
try:
    value = data["email"]
except KeyError as e:
    print(f"Key not found: {e}")
    value = None

5. defaultdict を使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from collections import defaultdict

# デフォルト値を自動生成
data = defaultdict(str)  # 文字列のデフォルト値 ""
data = defaultdict(int)  # 数値のデフォルト値 0
data = defaultdict(list)  # リストのデフォルト値 []

# 存在しないキーでもエラーにならない
data = defaultdict(int)
data["count"] += 1  # 自動的に 0 から始まる
print(data["count"])  # 1

6. キーの型を確認

1
2
3
4
5
6
7
8
data = {1: "one", "1": "string one"}

# 整数キーと文字列キーは別
print(data[1])    # "one"
print(data["1"])  # "string one"

# 型を確認
print(type(key))  # キーの型を確認

7. 辞書内包表記での安全なアクセス

1
2
3
4
5
6
7
8
keys_to_get = ["name", "email", "phone"]
data = {"name": "Alice"}

# ❌ KeyError が発生
values = {k: data[k] for k in keys_to_get}

# ✅ get() を使用
values = {k: data.get(k, "N/A") for k in keys_to_get}

8. JSON データの安全な取得

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import json

response = '{"user": {"name": "Alice"}}'
data = json.loads(response)

# ❌ ネストしたキーでエラー
email = data["user"]["email"]

# ✅ 段階的に確認
user = data.get("user", {})
email = user.get("email", "unknown")

# ✅ 一行で書く場合
email = data.get("user", {}).get("email", "unknown")

よくあるパターン

環境変数の取得

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import os

# ❌ KeyError が発生する可能性
api_key = os.environ["API_KEY"]

# ✅ デフォルト値を指定
api_key = os.environ.get("API_KEY", "")

# ✅ 必須の場合は明示的にエラー
api_key = os.environ.get("API_KEY")
if not api_key:
    raise ValueError("API_KEY environment variable is required")

Pandas での列アクセス

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import pandas as pd

df = pd.DataFrame({"name": ["Alice"], "age": [30]})

# ❌ KeyError が発生
df["email"]

# ✅ 列の存在確認
if "email" in df.columns:
    print(df["email"])

# ✅ get() を使用
df.get("email", pd.Series([]))

Python の他のエラー

最終更新: 2025-12-08