J'obtiens une erreur de clé en python

191

Dans mon programme python, j'obtiens cette erreur:

KeyError: 'variablename'

À partir de ce code:

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

Quelqu'un peut-il expliquer pourquoi cela se produit?

David Liaw
la source
11
Key errorsignifie généralement que le keyn'existe pas. Alors, êtes-vous sûr que «chemin» existe.?
RanRag
3
Imprimez le contenu de meta_entryet assurez-vous que la clé souhaitée existe.
Makoto

Réponses:

263

Un KeyErrorsignifie généralement que la clé n'existe pas. Alors, êtes-vous sûr que la pathclé existe?

À partir de la documentation officielle de Python:

exception KeyError

Déclenché lorsqu'une clé de mappage (dictionnaire) n'est pas trouvée dans l'ensemble de clés existantes.

Par exemple:

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

Alors, essayez d'imprimer le contenu de meta_entryet vérifiez s'il pathexiste ou non.

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

Ou, vous pouvez faire:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
RanRag
la source
hmm ... comment pourrais-je faire ça? (Désolé d'être un noob) L'application est hébergée sur le moteur d'application Google et je n'ai accès à aucun fichier qu'elle crée.
David Liaw
J'ai accès à mon code mais aucun des codes qu'il crée ou que le moteur utilise
David Liaw
Ainsi, le code que vous avez posté path = meta_entry['path'].strip('/'),fait partie de votre code ou du moteur. Si cela fait partie du moteur, je crains que rien ne puisse être fait.
RanRag
@lonehangman: il suffit de faire print meta_entryet de vérifier s'il contient pathou non.
RanRag
Je suis assez nouveau en python, pourriez-vous s'il vous plaît expliquer plus en détail. Désolé d'être un ravageur
David Liaw
128

Je suis entièrement d'accord avec les commentaires d'erreur clé. Vous pouvez également utiliser la méthode get () du dictionnaire pour éviter les exceptions. Cela pourrait également être utilisé pour donner un chemin par défaut plutôt que Nonecomme indiqué ci-dessous.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
Adam Lewis
la source
9
+1 pour un commentaire .get () très pertinent. On dirait une bonne application du Python EAFP (plus facile à demander pardon que la permission) au lieu de LBYL (Look Before You Leap) qui, je pense, est moins pythonique.
Niels Bom
32

Pour dict, utilisez simplement

if key in dict

et n'utilisez pas la recherche dans la liste des clés

if key in dict.keys()

Ce dernier prendra plus de temps.

keywind
la source
5

Oui, cela est probablement dû à une clé inexistante.

Dans mon programme, j'ai utilisé setdefault pour désactiver cette erreur, par souci d'efficacité. selon l'efficacité de cette ligne

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

Je suis également nouveau sur Python. En fait, je viens de l'apprendre aujourd'hui. Alors pardonnez-moi l'ignorance de l'efficacité.

En Python 3, vous pouvez également utiliser cette fonction,

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

On dit que cela ne soulèvera jamais une erreur clé.

Glenn Yu
la source
La méthode get est ancienne, je pense que même les dictionnaires 1.x l'avaient. Mais je suis sûr que 2.7 l'avait déjà.
Jürgen A. Erhard
3

Cela signifie que votre tableau n'a pas la clé que vous recherchez. Je gère cela avec une fonction qui renvoie la valeur si elle existe ou renvoie une valeur par défaut à la place.

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')

Production:

1
2
#default
Ben Sullins
la source
7
Argh ... horrible, horrible code impythonique. N'écrivez pas de code PHP en Python: ce n'est pas un tableau, c'est un dictionnaire (vous pouvez l'appeler un hachage, mais le tableau est juste). Et: les dictionnaires ont déjà votre fonction "keyCheck": au lieu de "keyCheck ('key1', myarray, '#default')" vous feriez "mydict.get ('key1', '#default')"
Jürgen A . Erhard
2

J'ai reçu cette erreur lors de l'analyse dictavec imbriqué 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:

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

Parce que dans la deuxième boucle devrait être cats[cat]juste cat(ce qui n'est qu'une clé)

Alors:

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])

Donne

black
10
white
8
Pbaranski
la source
0

Par exemple, s'il s'agit d'un nombre:

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

Cela fonctionne parfaitement, mais si vous utilisez par exemple:

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

cela ne fonctionne pas, car votre entrée renvoie la chaîne «1». Vous devez donc utiliser int ()

ouloulou[int(input("select 1 2 or 3"))]()
lemoinemeddy
la source
0

Laissez-nous simplifier les choses si vous utilisez Python 3

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

Si vous avez besoin d'une autre condition

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

Pour la valeur de clé dynamique, vous pouvez également gérer via le bloc 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'}
Muthu Kumar
la source