首页 > 解决方案 > python - 读取和写入文件时如何对Python IndexError:List Index out of range进行排序

问题描述

我正在用 Python 开发一个游戏,最后,分数被写入一个文件,然后从文件中提取前 5 个分数。这通常工作得很好,但是一旦我重置了高分,我就会收到一个索引错误,说“列表索引超出范围” Traceback(最近一次调用最后一次):

File "/home/leo/Documents/Python/infinitest/infinitest.py", line 172, in <module>
    scoreboard()
  File "/home/leo/Documents/Python/infinitest/infinitest.py", line 147, in scoreboard
    print("{0[0]} : {1[0]}\n{0[1]} : {1[1]}\n{0[2]} : {1[2]}\n{0[3]} : {1[3]}\n{0[4]} : {1[4]}".format(scores,names))
IndexError: list index out of range

我将如何解决这个问题

def scoreboard():
    c = add_up1(False)
    d = add_up2(False)
    with open("/home/leo/Documents/Python/infinitest/hi2.txt", "a+") as leaders:
        leaders.write('{},{}\n'.format(c,name1))
        leaders.write('{},{}\n'.format(d,name2))
        line=leaders.readline()
        dic={}
        for line in leaders:
            data = line.split(",")
            dic[int(data[0])] = data[1]
        dic1={}
        for key in sorted(dic.keys()):
            dic1[key]=dic[key]
        scores=list(dic1.keys())
        names=list(dic1.values())
        names =names[::-1]
        scores= scores[::-1]
        print("{0[0]} : {1[0]}\n{0[1]} : {1[1]}\n{0[2]} :{1[2]}\n{0[3]} : {1[3]}\n{0[4]} : {1[4]}".format(scores,names)) 

在外部文件中,它的格式是分数,后跟一个逗号,然后是一个用户名。例如:

100,exampleuser

add_up 函数很好,只返回总分。我尝试添加占位符分数来解决问题,例如

1,Placeholder1
2,Placeholder2
3,Placeholder3
4,Placeholder4
5,Placeholder5

这有时有效,但现在不再有效。

标签: pythonfileindex-error

解决方案


写入文件后,它的位置在最后——你可以用leaders.tell(). 当您开始阅读时,for 循环会立即退出,因为没有更多行并dic保持为空。稍后,scores并且names是空的,因此IndexError当您尝试访问项目时会得到一个。

在开始读取文件集之前,它的位置回到开头 - 如果有一个你不想跳过第一行的标题:

    ...
    leaders.seek(0)
    #_ = next(leaders)    # skip header
    for line in leaders:
        data = line.split(",")
        dic[int(data[0])] = data[1]

推荐阅读