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

ながみえ

Pythonで辞書を使っているときに、KeyError というエラーが表示されることがあります。

たとえば、次のように辞書から値を取り出そうとしたときに発生します。

user = {"name": "田中", "age": 20}

print(user["email"])

このコードを実行すると、次のようなエラーが出ます。

KeyError: 'email'

これは、email というキーが辞書の中に存在しないために起きるエラーです。

KeyErrorは、Python初心者が辞書を学習するときによく出会うエラーのひとつです。ただし、原因は比較的わかりやすく、エラーメッセージの見方と辞書のキーの確認方法を覚えれば、落ち着いて対処できます。

この記事では、PythonのKeyErrorの意味、よくある原因、エラーが出るコード例、修正方法を初心者向けに解説します。get()in を使ってKeyErrorを防ぐ方法も紹介するので、辞書を安全に扱いたい方はぜひ参考にしてください。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

KeyErrorとは

KeyErrorとは、Pythonの辞書で存在しないキーを指定したときに発生するエラーです。

辞書は、キーと値をセットで管理するデータ型です。たとえば、次の辞書では、name というキーに "田中"age というキーに 20 という値が入っています。

user = {"name": "田中", "age": 20}

この辞書から名前を取り出す場合は、次のようにキーを指定します。

print(user["name"])

実行結果は次のようになります。

田中

このように、辞書ではキーを使って値を取り出します。しかし、辞書の中に存在しないキーを指定すると、Pythonは「そのキーは見つかりません」と判断し、KeyErrorを出します。

たとえば、次のコードを見てみましょう。

user = {"name": "田中", "age": 20}

print(user["email"])

この辞書には、nameage はありますが、email というキーはありません。そのため、次のようなエラーが発生します。

KeyError: 'email'

このエラーメッセージの 'email' は、見つからなかったキー名を表しています。つまり、「email というキーを探したけれど、辞書の中にありませんでした」という意味です。

辞書に関する基本的な用語を整理すると、次のようになります。

用語意味
辞書キーと値をセットで保存するデータ
キー値を取り出すための名前
キーに対応して保存されているデータ
KeyError指定したキーが辞書にないときのエラー

KeyErrorは、変数名そのものが見つからないエラーではありません。辞書の中にあるはずのキーが見つからないときに発生します。

似たエラーとして、NameError があります。違いを簡単に整理すると、次のようになります。

エラー名主な原因
KeyError辞書の中に指定したキーがないuser["email"]
NameError変数名や関数名が定義されていないprint(username)

KeyErrorが出たときは、まずエラーメッセージの最後に表示されているキー名を確認しましょう。

そのキーが本当に辞書の中にあるかを確認することが、解決の第一歩です。

KeyErrorが起きる主な原因

KeyErrorは、辞書の中に存在しないキーを指定したときに発生します。

ただし、実際には「キーがない」といっても、いくつかのパターンがあります。単純にキーを作り忘れている場合もあれば、スペルミスや大文字・小文字の違いが原因になっている場合もあります。

まずは、KeyErrorが起きやすい原因を整理して見てみましょう。

原因内容確認すること
存在しないキーを指定している辞書の中にないキーで値を取り出そうとしている指定したキーが辞書にあるか
キーのスペルミスnameneme のように間違えているキー名のつづり
大文字と小文字の違いnameName を同じものだと思っている大文字・小文字が一致しているか
文字列と数値の違い"1"1 を同じキーだと思っているキーの型が合っているか
外部データにキーがないJSONやCSVなどのデータに想定した項目がない実際のデータにそのキーがあるか
削除時に存在しないキーを指定しているpop()del で、ないキーを削除しようとしている削除する前にキーがあるか

初心者のうちは、特に「スペルミス」「大文字と小文字の違い」「文字列と数値の違い」でKeyErrorになることが多いです。

たとえば、次のコードでは name というキーはありますが、Name というキーはありません。

user = {"name": "田中"}

print(user["Name"])

この場合、次のようなエラーが発生します。

KeyError: 'Name'

Pythonでは、nameName は別の文字として扱われます。そのため、人間から見ると似ていても、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 という辞書には、nameage というキーはありますが、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 と書いています。

scorescroe は、人間が見ると似ていますが、Pythonでは別のキーとして扱われます。1文字でも順番が違うと、まったく別のキーになります。

この場合は、キー名を正しく書き直します。

student = {"score": 80}

print(student["score"])

実行結果は次のようになります。

80

KeyErrorが出たときは、エラーメッセージに表示されているキー名をよく確認しましょう。スペルミスは気づきにくい原因なので、実際のキー一覧を表示して確認するのもおすすめです。

student = {"score": 80}

print(student.keys())

実行結果は次のようになります。

dict_keys(['score'])

keys() を使うと、辞書の中にどのキーがあるのかを確認できます。

大文字と小文字の違いでKeyErrorになる例

Pythonでは、大文字と小文字は区別されます。

そのため、nameName は同じキーではありません。次のコードを見てみましょう。

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 useremail キーがあるかを確認しています。

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では、nameName は別のキーとして扱われます。そのため、次のようなエラーが発生します。

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が出たときは、あわてずに「どのキーが見つからなかったのか」「そのキーは辞書の中にあるのか」を順番に確認しましょう。

原因を切り分ければ、初心者でも落ち着いて修正できます。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました