我在python中遇到关键错误


190

在我的python程序中,我收到此错误:

KeyError: 'variablename'

从此代码:

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

谁能解释为什么会这样?


10
Key error通常表示key不存在。那么,您确定“路径”存在吗?
RanRag

3
打印内容meta_entry并确保所需的密钥存在。
Makoto 2012年

Answers:


258

一个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

嗯...我该怎么做?(对不起,很抱歉)该应用程序托管在Google App Engine上,我无权访问其创建的任何文件。
David Liaw

我可以访问我的代码,但是无法访问它创建或引擎使用的任何代码
David Liaw 2012年

因此,您发布的代码path = meta_entry['path'].strip('/'),是代码或引擎的一部分。如果它是引擎的一部分,恐怕什么也做不了。
RanRag

@lonehangman:不只是print meta_entry检查它是否包含path
RanRag

我是python的新手,请您详细解释一下。对不起,是害虫
大卫廖

127

我完全同意主要错误评论。您也可以使用字典的get()方法来避免出现异常。这也可以用来提供默认路径,而不是None如下所示。

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

9
+1表示非常相关的.get()注释。看起来好像是Python EAFP(比请求权限更容易请求宽恕)而不是LBYL(跨越式学习)的不错的应用,我认为它不太像Python。
Niels Bom 2012年

32

对于字典,只需使用

if key in dict

而不使用

if key in dict.keys()

会很费时间


5

是的,它很可能是由不存在的密钥引起的。

在我的程序中,出于效率考虑,我使用setdefault将此错误静音。取决于这条线的效率

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

我也是Python的新手。实际上,我今天才学到它。因此,请原谅我对效率的无知。

在Python 3中,您也可以使用此功能,

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

据说它永远不会引发关键错误。


get方法是古老的,我认为即使是1.x字典也是如此。但我确定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
糟糕...可怕,可怕的非Python代码。不要用Python编写PHP代码:它不是数组,而是字典(您可以将其称为哈希,但是数组是正确的)。和:类型的字典已经有你“键校验”功能:不是“键校验(‘键1’,myarray中,‘#默认’)”你会做“mydict.get(‘键1’,‘#默认’)”
于尔根一Erhard

2

我在dict使用nested 进行解析时收到此错误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'

因为在第二个循环中应该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'}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.