Pythonでキーエラーが発生します


190

私のpythonプログラムでは、次のエラーが発生します。

KeyError: 'variablename'

このコードから:

path = meta_entry['path'].strip('/'),

なぜこれが起こっているのか誰でも説明できますか?


10
Key error一般的にはkey存在しないことを意味します。では、「パス」が存在することを確認しますか?
RanRag 2012

3
の内容を印刷し、meta_entry必要なキーが存在することを確認します。

回答:


258

Aは、KeyError一般的にキーが存在しないことを意味します。では、pathキーが存在することを確認しますか?

公式のPythonドキュメントから:

例外KeyError

既存のキーのセットにマッピング(辞書)キーが見つからない場合に発生します。

例えば:

>>> mydict = {'a':'1','b':'2'}
>>> mydict['a']
'1'
>>> mydict['c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'
>>>

そのため、内容を印刷して、存在meta_entryするかどうかを確認してくださいpath

>>> mydict = {'a':'1','b':'2'}
>>> print mydict
{'a': '1', 'b': '2'}

または、次のことができます。

>>> 'a' in mydict
True
>>> 'c' in mydict
False

うーん...どうすればいいですか?(noobになって申し訳ありません)アプリはgoogle app engineでホストされており、作成したファイルにアクセスできません。
David Liaw

私は自分のコードにアクセスできますが、作成したコードやエンジンが使用するコードはありません
David Liaw

したがって、投稿したコードpath = meta_entry['path'].strip('/'),は、コードまたはエンジンの一部です。それがエンジンの一部である場合、私は何もできないことを恐れています。
RanRag 2012

@lonehangman:実行print meta_entryするだけで、それが含まれているpathかどうかを確認します。
RanRag 2012

私はpythonにかなり慣れていません。詳しく説明していただけますか。害虫になって申し訳ありません
David Liaw

127

キーエラーコメントに完全に同意します。例外を回避するために、辞書のget()メソッドを使用することもできます。これは、None以下に示す方法ではなく、デフォルトのパスを指定するためにも使用できます。

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None

9
関連性の高い.get()コメントの+1。Python的ではないと思うLBYL(Look Before You Leap)ではなく、Python EAFP(許可よりも許しを求めるのが簡単)の良いアプリケーションのように見えます。
Niels Bom


5

はい、おそらく存在しないキーが原因です。

私のプログラムでは、効率性を考慮して、setdefaultを使用してこのエラーをミュートしました。このラインの効率に応じて

>>>'a' in mydict.keys()  

私はPythonも初めてです。実際、私は今日それを学びました。効率の無知を許してください。

Python 3では、この関数を使用することもできます。

get(key[, default]) [function doc][1]

キーエラーは発生しないと言われています。


getメソッドは古く、1.x dictsにもあったと思います。しかし、2.7はすでにそれを持っていると確信しています。
ユルゲン・A.エアハード

3

これは、配列に探しているキーがないことを意味します。存在する場合は値を返すか、代わりにデフォルト値を返す関数でこれを処理します。

def keyCheck(key, arr, default):
    if key in arr.keys():
        return arr[key]
    else:
        return default


myarray = {'key1':1, 'key2':2}

print keyCheck('key1', myarray, '#default')
print keyCheck('key2', myarray, '#default')
print keyCheck('key3', myarray, '#default')

出力:

1
2
#default

7
ああ...恐ろしい、恐ろしい非Pythonicコード。PythonでPHPコードを記述しないでください。これは配列ではなく、辞書です(ハッシュと呼ぶこともできますが、配列は正しいです)。そして:dictsにはすでに「keyCheck」関数があります。「keyCheck( 'key1'、myarray、 '#default')」の代わりに「mydict.get( 'key1'、 '#default')」を実行します
ユルゲンA 。エアハルト

2

dict入れ子で解析しているときにこのエラーを受け取りましたfor

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cat:
        print(cats[cat][attr])

トレースバック:

Traceback (most recent call last):
      File "<input>", line 3, in <module>
    KeyError: 'K'

2番目のループではcats[cat]代わりに単にcat(何が単なるキーであるあります)

そう:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cats[cat]:
        print(cats[cat][attr])

与える

black
10
white
8

0

たとえば、これが数値の場合:

ouloulou={
    1:US,
    2:BR,
    3:FR
    }
ouloulou[1]()

それは完璧に仕事だ、しかし、 あなたは、たとえば使用する場合:

ouloulou[input("select 1 2 or 3"]()

入力が文字列 '1'を返すため、機能しません。だからあなたはint()を使う必要があります

ouloulou[int(input("select 1 2 or 3"))]()

0

Python 3を使用している場合は簡単にしましょう

mydict = {'a':'apple','b':'boy','c':'cat'}
check = 'c' in mydict
if check:
    print('c key is present')

他に条件が必要な場合

mydict = {'a':'apple','b':'boy','c':'cat'}
if 'c' in mydict:
    print('key present')
else:
    print('key not found')

動的キー値の場合、try-exceptionブロックを介して処理することもできます

mydict = {'a':'apple','b':'boy','c':'cat'}
try:
    print(mydict['c'])
except KeyError:
    print('key value not found')mydict = {'a':'apple','b':'boy','c':'cat'}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.