2017-02-25 1805 views
-3

我已经写了一个python程序,它应该会返回每个关卡的最高得分玩家,但是它会一直返回第69行的“KeyError:20”(P_L1 = players_TS [ H_L1]),我无法解决如何解决这个问题。在我的代码我打开名为“playerScores.txt”文本文件,该文件的格式是这样的:
月亮,3,15
StarPlayer,2.18
艾莉,5,9

这里是我的代码:
我的python程序总是返回“KeyError:20”

print("The highest scorers for each leve are:\n") 
    PS3=open("PlayerScores.txt","r").read().split("\n") 
    level1_scores=[] 
    players_TS={} 
    level2_scores=[] 
    players_T2={} 
    level3_scores=[] 
    players_T3={} 
    level4_scores=[] 
    players_T4={} 
    level5_scores=[] 
    players_T5={} 

    for line in PS3: 
     lines=line.split(",") 
     player=lines[0] 
     level=lines[1] 
     score=lines[2] 

     erros=open("scoreboard_errorlog.text","w") 

     if int(score)>20: 
      errors.write(score) 
     if int(level)>5: 
      errors.write(level) 

     if int(level)==1: 
      level1_scores.append(int(score)) 
      players_TS.setdefault(score,[]).append(player) 
     if int(level)==2: 
      level2_scores.append(int(score)) 
      players_T2.setdefault(score,[]).append(player) 
     if int(level)==3: 
      level3_scores.append(int(score)) 
      players_T3.setdefault(score,[]).append(player) 
     if int(level)==4: 
      level4_scores.append(int(score)) 
      players_T4.setdefault(score,[]).append(player) 
     if int(level)==5: 
      level5_scores.append(int(score)) 
      players_T5.setdefault(score,[]).append(player) 

    H_L1=max(level1_scores) 
    P_L1=players_TS[H_L1] 
    H_L2=max(level2_scores) 
    P_L2=players_T2[H_L2] 
    H_L3=max(level3_scores) 
    P_L3=players_T3[H_L3] 
    H_L4=max(level4_scores) 
    P_L4=players_T4[H_L4] 
    H_L5=max(level5_scores) 
    P_L5=players_T5[H_L5] 

    print("Level\tPlayer name\tScore\nLevel 1\t",P_L1,"\t",H_L1,"\nLevel 2\t",P_L2,"\t",H_L2,"\nLevel 3\t",P_L3,"\t",H_L3,"\nLevel 4\t",P_L4,"\t",H_L4,"\nLevel 5\t",P_L5,"\t",H_L5) 

帮助将不胜感激。

+0

您可以从确定错误发生的位置开始。 –

+0

'erros = open(..''和'errors.write(...'是一个错字 –

+0

@ScottHunter)对不起,我忘了指定 - 它是69行(P_L1 = players_TS [H_L1]) –

回答

2

的问题就出现在这里:

if int(level)==1: 
    level1_scores.append(int(score)) 
    players_TS.setdefault(score,[]).append(player) 

假设score == "20"。您正在将整数20改为level1_scores,但使用字符串"20"作为players_TS中的键。然后,当你到这些线路

H_L1=max(level1_scores) 
P_L1=players_TS[H_L1] 

H_L1是整数值20,但在players_TS所有的按键都像"20"字符串。由于20 != "20",因此有KeyError结果。

有可能的,你想拥有score(和level,对于这个问题)是整个一个整数,所以一旦你马上解析后转换,然后使用score因为是在循环的剩余部分。

for line in PS3: 
    lines = line.split(",") 
    player = lines[0] 
    level = int(lines[1]) 
    score = int(lines[2]) 

    with open("scoreboard_errorlog.text","w") as errors: 

     if score > 20: 
      errors.write(score) 
     if level > 5: 
      errors.write(level) 

    if level == 1: 
     level1_scores.append(score) 
     players_TS.setdefault(score,[]).append(player) 
    elif level == 2: 
     level2_scores.append(score) 
     players_T2.setdefault(score,[]).append(player) 
    elif level == 3: 
     level3_scores.append(score) 
     players_T3.setdefault(score,[]).append(player) 
    elif level == 4: 
     level4_scores.append(score) 
     players_T4.setdefault(score,[]).append(player) 
    elif level == 5: 
     level5_scores.append(score) 
     players_T5.setdefault(score,[]).append(player) 

    H_L1 = max(level1_scores) 
    P_L1 = players_TS[H_L1] 
    H_L2 = max(level2_scores) 
    P_L2 = players_T2[H_L2] 
    H_L3 = max(level3_scores) 
    P_L3 = players_T3[H_L3] 
    H_L4 = max(level4_scores) 
    P_L4 = players_T4[H_L4] 
    H_L5 = max(level5_scores) 
    P_L5 = players_T5[H_L5] 

不过,你也应该使用dict s到存储大量的这些数据,而不是单独命名的变量。

level_scores = {level: [] for level in range(1,6)} 
players = {} 
for line in PS3: 
    lines = line.split(",") 
    player = lines[0] 
    level = int(lines[1]) 
    score = int(lines[2]) 

    # Use append mode, or you overwrite the file each time through the loop 
    with open("scoreboard_errorlog.text", "a") as errors: 

     if score > 20: 
      errors.write(score) 
     if level > 5: 
      errors.write(level) 
      continue 

    level_scores[level].append(score) 
    players[level].setdefault(score,[]).append(player) 


H = {} 
P = {} 
for level in range(1,6): 
    H[level] = max(level_scores[level]) 
    P[level] = players[level][H[level]]