Ошибка при расконсервации данных

Пишу функцию для викторины. Мне нужно достать из законсервированного файла рекорды (только очки). Если файл пустой, я заполняю его числами 0, 1, 2, 3 и 4. При запуске получаю следующую ошибку:

File "D:/Работа/Python/quiz/main.py", line 91, in record
    first = pickle.load(f)
EOFError: Ran out of input

Вот часть кода функции:

def record(score, record_file):
    f = open(record_file, "wb+")
    try:
        first = pickle.load(f)
    except EOFError:
        pickle.dump(4, f)
        pickle.dump(3, f)
        pickle.dump(2, f)
        pickle.dump(1, f)
        pickle.dump(0, f)
        first = pickle.load(f)
    second = pickle.load(f)
    third = pickle.load(f)
    fourth = pickle.load(f)
    fifth = pickle.load(f) 

Подскажите, в чём может быть проблема? Я подозреваю, что неправильно консервирую данные.


Ответы (1 шт):

Автор решения: MaxU

Теоретически, в pickle файл можно дописывать данные если открывать его в режиме r+b или ab:

def add_to_pickle(obj, filename):
    with open(filename, "ab") as f:
        pickle.dump(obj, f)

add_to_pickle(1, filename)
add_to_pickle("a string", filename)
add_to_pickle([1, 2, 3], filename)

но читать из такого файла надо будет аккуратно - мы не знаем когда файл закончится:

def read_from_pickle(filename):
    with open(filename, "rb") as f:
        while True:
            try:
                yield pickle.load(f)
            except EOFError:
                break

пример:

In [29]: [x for x in read_from_pickle(filename)]
Out[29]: [1, 'a string', [1, 2, 3]]

UPDATE: лучше и безопаснее накапливать данные в список или словарь и перезаписывать pickle файл обновленным словарем - тогда мы знаем, что в pickle файле всего один объект.

→ Ссылка