PythonのKeyErrorとは?意味・原因・直し方を初心者向けに解説

Pythonで辞書を使っているときに、KeyError というエラーが表示されることがあります。
たとえば、次のように辞書から値を取り出そうとしたときに発生します。
user = {"name": "田中", "age": 20}
print(user["email"])このコードを実行すると、次のようなエラーが出ます。
KeyError: 'email'
これは、email というキーが辞書の中に存在しないために起きるエラーです。
KeyErrorは、Python初心者が辞書を学習するときによく出会うエラーのひとつです。ただし、原因は比較的わかりやすく、エラーメッセージの見方と辞書のキーの確認方法を覚えれば、落ち着いて対処できます。
この記事では、PythonのKeyErrorの意味、よくある原因、エラーが出るコード例、修正方法を初心者向けに解説します。get() や in を使ってKeyErrorを防ぐ方法も紹介するので、辞書を安全に扱いたい方はぜひ参考にしてください。


KeyErrorとは
KeyErrorとは、Pythonの辞書で存在しないキーを指定したときに発生するエラーです。
辞書は、キーと値をセットで管理するデータ型です。たとえば、次の辞書では、name というキーに "田中"、age というキーに 20 という値が入っています。
user = {"name": "田中", "age": 20}この辞書から名前を取り出す場合は、次のようにキーを指定します。
print(user["name"])
実行結果は次のようになります。
田中
このように、辞書ではキーを使って値を取り出します。しかし、辞書の中に存在しないキーを指定すると、Pythonは「そのキーは見つかりません」と判断し、KeyErrorを出します。
たとえば、次のコードを見てみましょう。
user = {"name": "田中", "age": 20}
print(user["email"])この辞書には、name と age はありますが、email というキーはありません。そのため、次のようなエラーが発生します。
KeyError: 'email'
このエラーメッセージの 'email' は、見つからなかったキー名を表しています。つまり、「email というキーを探したけれど、辞書の中にありませんでした」という意味です。
辞書に関する基本的な用語を整理すると、次のようになります。
| 用語 | 意味 |
|---|---|
| 辞書 | キーと値をセットで保存するデータ |
| キー | 値を取り出すための名前 |
| 値 | キーに対応して保存されているデータ |
| KeyError | 指定したキーが辞書にないときのエラー |
KeyErrorは、変数名そのものが見つからないエラーではありません。辞書の中にあるはずのキーが見つからないときに発生します。
似たエラーとして、NameError があります。違いを簡単に整理すると、次のようになります。
| エラー名 | 主な原因 | 例 |
|---|---|---|
| KeyError | 辞書の中に指定したキーがない | user["email"] |
| NameError | 変数名や関数名が定義されていない | print(username) |
KeyErrorが出たときは、まずエラーメッセージの最後に表示されているキー名を確認しましょう。
そのキーが本当に辞書の中にあるかを確認することが、解決の第一歩です。
KeyErrorが起きる主な原因
KeyErrorは、辞書の中に存在しないキーを指定したときに発生します。
ただし、実際には「キーがない」といっても、いくつかのパターンがあります。単純にキーを作り忘れている場合もあれば、スペルミスや大文字・小文字の違いが原因になっている場合もあります。
まずは、KeyErrorが起きやすい原因を整理して見てみましょう。
| 原因 | 内容 | 確認すること |
|---|---|---|
| 存在しないキーを指定している | 辞書の中にないキーで値を取り出そうとしている | 指定したキーが辞書にあるか |
| キーのスペルミス | name を neme のように間違えている | キー名のつづり |
| 大文字と小文字の違い | name と Name を同じものだと思っている | 大文字・小文字が一致しているか |
| 文字列と数値の違い | "1" と 1 を同じキーだと思っている | キーの型が合っているか |
| 外部データにキーがない | JSONやCSVなどのデータに想定した項目がない | 実際のデータにそのキーがあるか |
| 削除時に存在しないキーを指定している | pop() や del で、ないキーを削除しようとしている | 削除する前にキーがあるか |
初心者のうちは、特に「スペルミス」「大文字と小文字の違い」「文字列と数値の違い」でKeyErrorになることが多いです。
たとえば、次のコードでは name というキーはありますが、Name というキーはありません。
user = {"name": "田中"}
print(user["Name"])この場合、次のようなエラーが発生します。
KeyError: 'Name'
Pythonでは、name と Name は別の文字として扱われます。そのため、人間から見ると似ていても、Pythonにとってはまったく違うキーになります。
また、数字に見えるキーでも、文字列か数値かによって扱いが変わります。
scores = {"1": 90, "2": 75}
print(scores[1])この辞書のキーは "1" という文字列です。しかし、取り出すときには 1 という数値を指定しています。見た目は似ていますが、文字列の "1" と数値の 1 は別のものです。
そのため、このコードでは次のようなエラーが発生します。
KeyError: 1
KeyErrorが出たときは、エラーメッセージに表示されたキー名だけでなく、実際に辞書の中に入っているキーも確認することが大切です。
辞書のキーを確認したいときは、keys() を使います。
user = {"name": "田中", "age": 20}
print(user.keys())実行結果は次のようになります。
dict_keys(['name', 'age'])
このように keys() を使うと、辞書の中にどのキーがあるのかを確認できます。KeyErrorが出たときは、まず keys() で実際のキー一覧を表示してみると、原因を見つけやすくなります。
KeyErrorのエラー例と修正例
ここからは、実際にKeyErrorが発生するコードと、その修正例を見ていきます。
KeyErrorは、エラーメッセージだけを見ると難しく感じるかもしれません。しかし、基本的には「指定したキーが辞書の中にあるか」を確認すれば、原因を見つけやすくなります。
存在しないキーを指定している例
まずは、辞書に存在しないキーを指定している基本的な例です。
user = {"name": "田中", "age": 20}
print(user["email"])このコードを実行すると、次のようなエラーが発生します。
KeyError: 'email'
user という辞書には、name と age というキーはありますが、email というキーはありません。
そのため、user["email"] と書くと、Pythonは email というキーを探しますが、見つけることができずにKeyErrorを出します。
この場合は、辞書に存在するキーを指定する必要があります。
user = {"name": "田中", "age": 20}
print(user["name"])実行結果は次のようになります。
田中
もし email という情報を使いたい場合は、最初から辞書に email キーを追加しておきます。
user = {"name": "田中", "age": 20, "email": "tanaka@example.com"}
print(user["email"])実行結果は次のようになります。
tanaka@example.com
このように、KeyErrorが出たときは「取り出そうとしているキー」と「辞書に実際に入っているキー」が一致しているかを確認しましょう。
キーのスペルミスでKeyErrorになる例
次に、キー名のスペルミスによってKeyErrorが発生する例を見てみましょう。
student = {"score": 80}
print(student["scroe"])このコードを実行すると、次のようなエラーが発生します。
KeyError: 'scroe'
辞書に入っているキーは score ですが、取り出すときに scroe と書いています。
score と scroe は、人間が見ると似ていますが、Pythonでは別のキーとして扱われます。1文字でも順番が違うと、まったく別のキーになります。
この場合は、キー名を正しく書き直します。
student = {"score": 80}
print(student["score"])実行結果は次のようになります。
80
KeyErrorが出たときは、エラーメッセージに表示されているキー名をよく確認しましょう。スペルミスは気づきにくい原因なので、実際のキー一覧を表示して確認するのもおすすめです。
student = {"score": 80}
print(student.keys())実行結果は次のようになります。
dict_keys(['score'])
keys() を使うと、辞書の中にどのキーがあるのかを確認できます。
大文字と小文字の違いでKeyErrorになる例
Pythonでは、大文字と小文字は区別されます。
そのため、name と Name は同じキーではありません。次のコードを見てみましょう。
user = {"name": "佐藤"}
print(user["Name"])このコードを実行すると、次のようなエラーが発生します。
KeyError: 'Name'
辞書には name というキーがありますが、Name というキーはありません。
人間にとっては似た名前に見えますが、Pythonでは大文字と小文字が違うだけでも別のキーとして扱われます。
この場合は、辞書に登録されているキー名に合わせて書きます。
user = {"name": "佐藤"}
print(user["name"])実行結果は次のようになります。
佐藤
特に、外部のデータを扱う場合は、キー名が name なのか Name なのか、または NAME なのかを確認することが大切です。
文字列のキーと数値のキーを間違えている例
KeyErrorは、キーの型が違う場合にも発生します。
次のコードでは、辞書のキーとして "1" と "2" を使っています。
scores = {"1": 90, "2": 75}
print(scores[1])このコードを実行すると、次のようなエラーが発生します。
KeyError: 1
辞書のキーは "1" という文字列です。しかし、値を取り出すときに指定しているのは 1 という数値です。
見た目は似ていますが、Pythonでは文字列の "1" と数値の 1 は別のものとして扱われます。
この場合は、辞書に登録されているキーの型に合わせて指定します。
scores = {"1": 90, "2": 75}
print(scores["1"])実行結果は次のようになります。
90
文字列と数値の違いは、初心者が見落としやすいポイントです。KeyErrorが出たときは、キー名だけでなく、キーの型も確認しましょう。
pop()で存在しないキーを削除しようとしている例
KeyErrorは、値を取り出すときだけでなく、辞書から要素を削除するときにも発生します。
たとえば、pop() を使って存在しないキーを削除しようとすると、KeyErrorになります。
user = {"name": "田中"}
user.pop("email")このコードを実行すると、次のようなエラーが発生します。
KeyError: 'email'
user という辞書には、email というキーがありません。そのため、pop("email") で削除しようとしても、削除する対象が見つからずにKeyErrorになります。
この場合は、pop() の第2引数に、キーが存在しなかった場合の値を指定できます。
user = {"name": "田中"}
email = user.pop("email", "未登録")
print(email)実行結果は次のようになります。
未登録
このように書くと、email キーが存在しない場合でもKeyErrorは発生しません。
pop() を使うときは、指定したキーが必ず存在するのか、それとも存在しない可能性があるのかを考えておくと安全です。
delで存在しないキーを削除しようとしている例
del を使って辞書の要素を削除する場合も、存在しないキーを指定するとKeyErrorになります。
次のコードを見てみましょう。
user = {"name": "田中"}
del user["email"]このコードを実行すると、次のようなエラーが発生します。
KeyError: 'email'
email というキーが辞書に存在しないため、削除することができません。
del を使う場合は、削除する前にキーが存在するかを確認すると安全です。
user = {"name": "田中"}
if "email" in user:
del user["email"]
else:
print("emailキーは存在しません")実行結果は次のようになります。
emailキーは存在しません
del は、キーが存在することが分かっている場合には便利です。ただし、キーがあるかどうか分からない場合は、事前に in で確認してから削除すると、KeyErrorを防ぎやすくなります。
KeyErrorを防ぐ書き方
KeyErrorは、辞書に存在しないキーを指定したときに発生します。
そのため、キーが必ず存在すると分かっている場合は dict["key"] のように書いて問題ありません。しかし、キーがあるかどうか分からない場合は、あらかじめ確認したり、キーがない場合の値を用意したりすると安全です。
KeyErrorを防ぐ代表的な方法は、次の3つです。
| 方法 | 使う場面 |
|---|---|
get() を使う | キーがない場合に、代わりの値を使いたいとき |
in で確認する | キーがある場合だけ処理したいとき |
try-except を使う | KeyErrorが出たときの処理をまとめて書きたいとき |
初心者のうちは、まず get() と in の使い方を覚えるのがおすすめです。どちらも辞書を安全に扱うときによく使われます。
get()を使ってKeyErrorを防ぐ方法
get() は、辞書から値を取り出すときに使えるメソッドです。
通常、user["email"] のように書くと、email キーが存在しない場合にKeyErrorが発生します。しかし、get() を使うと、キーが存在しない場合でもエラーにせず、代わりの値を返すことができます。
まずは、KeyErrorが発生する例を見てみましょう。
user = {"name": "田中", "age": 20}
print(user["email"])このコードを実行すると、次のようなエラーが発生します。
KeyError: 'email'
この場合は、get() を使うことでKeyErrorを防ぐことができます。
user = {"name": "田中", "age": 20}
print(user.get("email"))実行結果は次のようになります。
None
get() は、指定したキーが存在しない場合、標準では None を返します。
また、第2引数を指定すると、キーが存在しなかった場合に返す値を自分で決めることができます。
user = {"name": "田中", "age": 20}
print(user.get("email", "メールアドレスは未登録です"))実行結果は次のようになります。
メールアドレスは未登録です
このように、キーがない可能性がある場合は、get() を使うと安全に値を取り出せます。
特に、JSONやCSVなどの外部データを扱うときは、すべてのデータに同じキーが入っているとは限りません。そのような場面では、get() を使うとKeyErrorを防ぎやすくなります。
inを使ってキーがあるか確認する方法
in を使うと、指定したキーが辞書の中に存在するかを確認できます。
キーがある場合だけ値を取り出したいときや、キーがない場合に別の処理をしたいときに便利です。
次の例では、email キーが存在するかどうかを確認してから、値を取り出しています。
user = {"name": "田中", "age": 20}
if "email" in user:
print(user["email"])
else:
print("メールアドレスは登録されていません")実行結果は次のようになります。
メールアドレスは登録されていません
このコードでは、先に "email" in user で email キーがあるかを確認しています。
email キーがある場合だけ user["email"] を実行するため、KeyErrorが発生しません。
キーが存在する場合の例も見てみましょう。
user = {"name": "田中", "age": 20, "email": "tanaka@example.com"}
if "email" in user:
print(user["email"])
else:
print("メールアドレスは登録されていません")実行結果は次のようになります。
tanaka@example.com
in は、キーがあるかどうかによって処理を分けたいときに向いています。
一方で、単純に「キーがなければ代わりの値を使いたい」という場合は、get() の方が短く書けます。
get()とinの使い分け
get() と in は、どちらもKeyErrorを防ぐために使えます。
ただし、使いやすい場面が少し違います。どちらを使うべきか迷ったときは、次のように考えると分かりやすいです。
| 書き方 | 向いている場面 | 例 |
|---|---|---|
get() | キーがない場合に代わりの値を返したい | 未登録なら「未登録」と表示する |
in | キーがある場合とない場合で処理を分けたい | キーがあるときだけ削除する |
try-except | エラーが起きた場合の処理をまとめたい | 例外処理としてKeyErrorを扱う |
たとえば、メールアドレスがなければ「未登録」と表示するだけなら、get() が簡単です。
user = {"name": "田中"}
email = user.get("email", "未登録")
print(email)実行結果は次のようになります。
未登録
一方で、キーが存在する場合だけ特別な処理をしたいなら、in を使うと読みやすくなります。
user = {"name": "田中", "email": "tanaka@example.com"}
if "email" in user:
print("メールアドレスが登録されています")
print(user["email"])
else:
print("メールアドレスは未登録です")実行結果は次のようになります。
メールアドレスが登録されています tanaka@example.com
このように、値を取り出すだけなら get()、条件によって処理を分けたいなら in と考えると使い分けやすくなります。
try-exceptでKeyErrorを処理する方法
KeyErrorは、try-except を使って処理することもできます。
try-except は、エラーが発生する可能性のある処理を書き、エラーが起きた場合に別の処理を実行するための書き方です。
次の例では、email キーがない場合にKeyErrorを受け取り、メッセージを表示しています。
user = {"name": "田中"}
try:
print(user["email"])
except KeyError:
print("emailキーが見つかりません")実行結果は次のようになります。
emailキーが見つかりません
このように書くと、KeyErrorが発生してもプログラムが途中で止まらず、代わりの処理を実行できます。
ただし、初心者のうちは、まず get() や in を使ってキーの有無を確認する方法から覚えるのがおすすめです。
try-except は便利ですが、何でも例外処理で対応しようとすると、どこで問題が起きているのか分かりにくくなることがあります。
キーがない可能性が最初から分かっている場合は、get() や in を使う方が読みやすいコードになります。
KeyErrorに関するよくある質問
ここでは、PythonのKeyErrorで初心者がつまずきやすい疑問をまとめて解説します。
KeyErrorは、辞書のキーを確認すれば原因を見つけやすいエラーです。ただし、エラーメッセージの見方や、get() との使い分けで迷うこともあります。
よくある質問を順番に見ていきましょう。
KeyError: ‘name’ とはどういう意味ですか?
KeyError: 'name' は、name というキーが辞書の中に見つからなかったという意味です。
たとえば、次のコードではKeyErrorが発生します。
user = {"age": 20}
print(user["name"])この辞書には age というキーはありますが、name というキーはありません。そのため、Pythonは name を探すことができず、次のようなエラーを出します。
KeyError: 'name'
このエラーが出たときは、まず name というキーが本当に辞書に入っているか確認しましょう。
user = {"age": 20}
print(user.keys())実行結果は次のようになります。
dict_keys(['age'])
この結果を見ると、name キーがないことが分かります。
KeyErrorを出さずに辞書の値を取り出すにはどうすればよいですか?
キーが存在しない可能性がある場合は、get() を使うとKeyErrorを防げます。
通常、次のように存在しないキーを指定するとKeyErrorになります。
user = {"name": "田中"}
print(user["email"])しかし、get() を使うと、キーがない場合でもエラーになりません。
user = {"name": "田中"}
print(user.get("email", "未登録"))実行結果は次のようになります。
未登録
このように、キーがない場合に代わりの値を表示したいときは、get() を使うと便利です。
キーを定義しているのにKeyErrorが出るのはなぜですか?
キーを定義しているつもりでも、実際にはキー名が少し違っている場合があります。
よくある原因としては、スペルミス、大文字と小文字の違い、文字列と数値の違いがあります。
user = {"name": "田中"}
print(user["Name"])このコードでは、辞書にあるキーは name ですが、取り出すときに指定しているキーは Name です。
Pythonでは、name と Name は別のキーとして扱われます。そのため、次のようなエラーが発生します。
KeyError: 'Name'
キーを定義しているはずなのにKeyErrorが出る場合は、keys() を使って実際のキー名を確認してみましょう。
user = {"name": "田中"}
print(user.keys())実行結果は次のようになります。
dict_keys(['name'])
エラーに表示されたキー名と、keys() で表示されたキー名を見比べると、違いに気づきやすくなります。
KeyErrorとIndexErrorの違いは何ですか?
KeyErrorは、辞書で存在しないキーを指定したときに発生するエラーです。
一方、IndexErrorは、リストやタプルで存在しない番号を指定したときに発生するエラーです。違いを簡単に整理すると、次のようになります。
| エラー名 | 発生しやすいデータ型 | 主な原因 |
|---|---|---|
| KeyError | 辞書 | 存在しないキーを指定している |
| IndexError | リスト、タプル | 範囲外の番号を指定している |
たとえば、辞書で存在しないキーを指定するとKeyErrorになります。
user = {"name": "田中"}
print(user["age"])一方、リストで存在しない番号を指定するとIndexErrorになります。
fruits = ["apple", "banana"] print(fruits[5])
辞書はキー、リストは番号で値を取り出すと考えると、違いが分かりやすくなります。
try-exceptでKeyErrorを処理してもよいですか?
KeyErrorは、try-except を使って処理しても問題ありません。
たとえば、次のように書くと、email キーがない場合でもプログラムを止めずに処理できます。
user = {"name": "田中"}
try:
print(user["email"])
except KeyError:
print("emailキーが見つかりません")実行結果は次のようになります。
emailキーが見つかりません
ただし、キーがない可能性が最初から分かっている場合は、get() や in を使う方が読みやすいことが多いです。
たとえば、単純に代わりの値を表示したいだけなら、次のように get() を使うと短く書けます。
user = {"name": "田中"}
print(user.get("email", "未登録"))初心者のうちは、まず get() と in を使った書き方を覚え、そのあとで必要に応じて try-except を使うと理解しやすくなります。
まとめ|KeyErrorは辞書のキーを順番に確認しよう
KeyErrorは、Pythonの辞書で存在しないキーを指定したときに発生するエラーです。
エラーメッセージに KeyError: 'email' のように表示された場合は、email というキーが辞書の中に見つからなかったという意味です。まずは、エラーに表示されたキー名と、実際に辞書に入っているキーを確認しましょう。
辞書のキーを確認するときは、keys() を使うと便利です。
user = {"name": "田中", "age": 20}
print(user.keys())実行結果は次のようになります。
dict_keys(['name', 'age'])
KeyErrorの主な原因は、存在しないキーの指定、スペルミス、大文字と小文字の違い、文字列と数値の違いです。
キーがない可能性がある場合は、get() や in を使うとKeyErrorを防ぎやすくなります。
user = {"name": "田中"}
print(user.get("email", "未登録"))KeyErrorが出たときは、あわてずに「どのキーが見つからなかったのか」「そのキーは辞書の中にあるのか」を順番に確認しましょう。
原因を切り分ければ、初心者でも落ち着いて修正できます。

