итерация по списку объектов, загружаемых pickle

В разделе игры, которую я создаю, пользователь вводит имя пользователя. Имя пользователя и оценка пользователя сохраняются в объекте, который маринуется во внешнем файле, в котором есть другие объекты маринованной оценки.

Затем у меня есть кнопка в пользовательском интерфейсе, при нажатии на которую должны отображаться самые высокие баллы всех игроков в порядке убывания.

Я загружаю файл в список с кодом, который я нашел здесь .

Highscores = []
Highscores = pickle.load(open("Highscores.txt", "rb"))

Затем я использую пузырьковую сортировку для сортировки списка объектов, показанного ниже.

def bubbleSort():
    swapOccured = True
    while swapOccured == True:
        swapOccured = False
        for i in Highscores:
            if Highscores[i].score > Highscores[i + 1].score:
                hold = Highscores[i + 1]
                Highscore[i + 1] = Highscores[i]
                Highscores[i] = Highscores[i + 1]
                swapOccured = True

Ошибка, которая возвращается,

for index in Highscores:
TypeError: iteration over non-sequence

Я просмотрел другие подобные вопросы, например, здесь, но ошибка заключалась в том, что программа перебирал объект, а не перебирал список объектов. Я почти уверен, что это не та же ошибка, что и в примере, я думаю, это может быть связано с загрузкой списка объектов с рассолом, но я застрял.

Любая помощь будет принята с благодарностью.


person Adam Higgins    schedule 11.01.2017    source источник
comment
Определение Highscores в виде списка перед загрузкой рассола не меняет того, что представляет собой объект при его загрузке; он просто перезаписывает предыдущее значение. Понятно, что все, что было сохранено в рассоле, — это не список.   -  person Daniel Roseman    schedule 12.01.2017
comment
@DanielRoseman да. Я думаю, что добавляю объекты в рассол, как будто это список, но это не так. Это код, который я использую для сброса. currScore = calculateScore() currUser = tkSimpleDialog.askstring("","Please enter a Username:") newHighscore = scoreEntry(currScore, currUser) with open("Highscores.txt", "ab") as f: pickle.dump(newHighscore, f)   -  person Adam Higgins    schedule 12.01.2017


Ответы (1)


Точно так же, как pickle.dump выгружает один объект в файл, pickle.load загружает один объект из файла. Если вам нужен список, вам нужно будет загрузить их все:

with open("Highscores.txt", "rb") as score_file:
    Highscores = []
    while True:
        try:
            Highscores.append(pickle.load(score_file))
        except EOFError:
            break
person zondo    schedule 11.01.2017