Почему я получаю «Pickle – EOFError: Ran из ввода», читающий пустой файл?

Я получаю интересную ошибку при попытке использовать Unpickler.load() , вот исходный код:

 open(target, 'a').close() scores = {}; with open(target, "rb") as file: unpickler = pickle.Unpickler(file); scores = unpickler.load(); if not isinstance(scores, dict): scores = {}; 

Вот трассировка:

 Traceback (most recent call last): File "G:\python\pendu\user_test.py", line 3, in <module>: save_user_points("Magix", 30); File "G:\python\pendu\user.py", line 22, in save_user_points: scores = unpickler.load(); EOFError: Ran out of input 

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

3 Solutions collect form web for “Почему я получаю «Pickle – EOFError: Ran из ввода», читающий пустой файл?”

Я бы проверял, что файл сначала не пуст:

 import os scores = {} # scores is an empty dict already if os.path.getsize(target) > 0: with open(target, "rb") as f: unpickler = pickle.Unpickler(f) # if file is not empty scores will be equal # to the value unpickled scores = unpickler.load() 

Также open(target, 'a').close() ничего не делает в вашем коде, и вам не нужно использовать ; ,

Вы можете поймать это исключение и вернуть то, что вы хотите оттуда.

 open(target, 'a').close() scores = {}; try: with open(target, "rb") as file: unpickler = pickle.Unpickler(file); scores = unpickler.load(); if not isinstance(scores, dict): scores = {}; except EOFError: return {} 

Как вы видите, это на самом деле естественная ошибка.

Типичная конструкция для чтения из объекта Unpickler будет такой.

 try: data = unpickler.load() except EOFError: data = list() # or whatever you want 

EOFError просто поднят, потому что он читает пустой файл, это просто означает « Конец файла» .

  • pickle - размещение более одного объекта в файле?
  • Загрузка файлов в переменные в python
  • Способы хранения и доступа к большим (~ 10 ГБ) спискам в Python?
  • Травление статического метода в Python
  • Чтение сразу нескольких питонских маринованных данных, буферизации и новых строк?
  • Как рассолить CookieJar?
  • Установка объекта в API кэша Django завершается сбоем из-за ошибки сортировки
  • Травление DataFrame
  • Python - лучший язык программирования в мире.