Ошибка при расконсервации данных
Пишу функцию для викторины. Мне нужно достать из законсервированного файла рекорды (только очки). Если файл пустой, я заполняю его числами 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 файле всего один объект.