需要处理keyerror异常python

时间:2012-11-28 13:40:42

标签: python exception search dictionary

当我输入一个不在记录列表中的播放器名称时,我收到了一个keyerror异常。我可以搜索它并找回任何有效的名字,但是如果我输入任何其他内容,我会得到一个关键的错误。我不太确定如何处理这个问题,因为它已经解决了处理解析我的文件所产生的3组数据的麻烦。

我知道这段代码很糟糕我是python的新手所以请原谅这个烂摊子 - 还要注意这是一个测试文件,以使这个功能正常工作,然后我将写入我真正的主文件中的函数。如果有任何意义,可以在这里找到测试平台。

这是我的数据文件stats4.txt中包含的内容:

[00000] Cho'Gath - 12/16/3 - Loss - 2012-11-22
[00001] Fizz - 12/5/16 - Win - 2012-11-22
[00002] Caitlyn - 13/4/6 - Win - 2012-11-22
[00003] Sona - 4/5/9 - Loss - 2012-11-23
[00004] Sona - 2/1/20 - Win - 2012-11-23
[00005] Sona - 6/3/17 - Loss - 2012-11-23
[00006] Caitlyn - 14/2/16 - Win - 2012-11-24
[00007] Lux - 10/2/14 - Win - 2012-11-24
[00008] Sona - 8/1/22 - Win - 2012-11-27

这是我的代码:

import re

info = {}
records = []
search = []
with open('stats4.txt') as data:
    for line in data:
        gameid = [item.strip('[') for item in line.split(']')]
        del gameid[-1]
        gameidstr = ''.join(gameid)
        gameid = gameidstr
        line = line[7:]
        player, stats, outcome, date = [item.strip() for item in line.split('-', 3)]
        stats = dict(zip(('kills', 'deaths', 'assists'), map(int, stats.split('/'))))
        date = tuple(map(int, date.split('-')))
        info[player] = dict(zip(('gameid', 'player', 'stats', 'outcome', 'date'), (gameid, player, stats, outcome, date)))
        records.append(tuple((gameid, info[player])))

print "\n\n", info, "\n\n" #print the info dictionary just to see 
champ = raw_input() #get champion name
#print info[champ].get('stats').get('kills'), "\n\n"
#print "[%s] %s - %s/%s/%s - %s-%s-%s" % (info[champ].get('gameid'), champ, info[champ].get('stats').get('kills'), info[champ].get('stats').get('deaths'), info[champ].get('stats').get('assists'), info[champ].get('date')[0], info[champ].get('date')[1], info[champ].get('date')[2])
#print "\n\n"
#print info[champ].values()

i = 0
for item in records: #this prints out all records
    print "\n", "[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (records[i][0], records[i][1]['player'], records[i][1]['stats']['kills'], records[i][1]['stats']['deaths'], records[i][1]['stats']['assists'], records[i][1]['outcome'], records[i][1]['date'][0], records[i][1]['date'][1], records[i][1]['date'][2])
    i = i + 1

print "\n" + "*" * 50
i = 0
for item in records:
    if champ in records[i][1]['player']:
        search.append(records[i][1])
    else:
        pass
    i = i + 1

s = 0

if not search:
    print "no availble records" #how can I get this to print even if nothing is inputted in raw_input above for champ?


print "****"
for item in search:
        print "\n[%s] %s - %s/%s/%s - %s - %s-%s-%s" % (search[s]['gameid'], search[s]['player'], search[s]['stats']['kills'], search[s]['stats']['deaths'], search[s]['stats']['assists'], search[s]['outcome'], search[s]['date'][0], search[s]['date'][1], search[s]['date'][2])
        s = s + 1

我尝试设置试用;除了类似的东西,但输入无效的玩家名称时我得不到任何不同的结果。我想我可能会设置一个功能并返回不同的东西,如果名称存在与否,但我想我只是让自己有点困惑。另请注意,对于不匹配的8条记录,确实没有匹配,但这并不是我想要它的工作方式。基本上我需要为任何无效的输入名称得到类似的东西,而不仅仅是一个恰好不在循环记录中的有效输入。

此数据的有效输入名称为: Cho'Gath,Fizz,Caitlyn,Sona或Lux - 其他任何东西都给出了一个keyerror,这就是我需要处理的东西所以它不会引发错误,而只是打印出类似“没有可用于该冠军的记录”(和打印)只有一次,而不是8次)

感谢您的帮助!

[编辑]我终于能够在帖子中更新此代码(感谢martineau将其添加进去,由于某种原因,反引号无法阻止代码,它显示为粗体正常文本当我粘贴时。无论如何,看看if not search,即使没有输入任何东西我怎么能打印呢?只需按raw_input上的返回,目前它打印****之后的所有记录,即使我没有不给它任何搜索冠军

2 个答案:

答案 0 :(得分:3)

您的确切错误发生在哪里?

我假设它是在champ = raw_input() #get champion name

的时候

然后info[champ]

您可以先检查密钥是否存在

if champ not in info:
  print 'no records avaialble'

或使用get

if info.get(champ)

或者您可以尝试访问密钥

try:
  info[champ] 
  # do stuff
except KeyError:
  print 'no records available'

你问题越具体越好,虽然你解释了你的问题但你没有包含任何细节请尽可能包括追溯,并将相关代码发布到你的帖子而不是链接。

答案 1 :(得分:1)

以下是我认为解决您问题的一些修改。我还重新格式化了代码,使其更具可读性。在Python中,可以通过以\结尾或者如果在前一行中存在未配对的'('或'[')而转到下一行,则可以将长行继续到下一行。

此外,我在我的问题或答案中放置代码的方法是将其从我的文本编辑器中删除,然后将其粘贴到编辑窗口中,之后我确保它全部被选中然后只使用{{1编辑窗口顶部的工具将其全部格式化。

{}