Я получаю интересную ошибку при попытке использовать 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
Файл, который я пытаюсь прочитать, пуст. Как мне избежать этой ошибки и вместо этого получить пустую переменную?
open(...).close()
здесь, чтобы убедиться, что файл существуетОтветы:
Я бы сначала проверил, что файл не пустой:
Также
open(target, 'a').close()
ничего не делает в вашем коде, и вам не нужно его использовать;
.источник
;
но я только что пришел с C, и отсутствие использования;
в конце моих строк заставляет меня плакать TTEOF exception
не спасет вас от всех других потенциальных ошибок.Большинство ответов здесь касаются того, как управлять исключениями EOFError, что действительно удобно, если вы не уверены, является ли маринованный объект пустым или нет.
Однако, если вы удивлены, что файл pickle пуст, это может быть потому, что вы открыли имя файла с помощью 'wb' или в другом режиме, который мог перезаписать файл.
например:
Это перезапишет маринованный файл. Вы могли сделать это по ошибке перед использованием:
А затем получил ошибку EOFError, потому что предыдущий блок кода перезаписал файл cd.pkl.
При работе в Jupyter или в консоли (Spyder) я обычно пишу оболочку поверх кода чтения / записи и впоследствии вызываю оболочку. Это позволяет избежать распространенных ошибок чтения-записи и сэкономить немного времени, если вы собираетесь читать один и тот же файл несколько раз в течение своих трудностей.
источник
However, if you're surprised that the pickle file is empty, it could be because you opened the filename through 'wb' or some other mode that could have over-written the file
Это заставило вас выиграть +1Как видите, это на самом деле естественная ошибка ...
Типичная конструкция для чтения из объекта Unpickler будет такой ..
EOFError просто возникает, потому что он читал пустой файл, это просто означало конец файла ..
источник
Очень вероятно, что маринованный файл пустой.
На удивление легко перезаписать файл pickle, если вы копируете и вставляете код.
Например, следующее записывает файл рассола:
И если вы скопировали этот код, чтобы снова открыть его, но забыли изменить
'wb'
на,'rb'
тогда вы бы перезаписали файл:Правильный синтаксис
источник
источник
Вы можете поймать это исключение и вернуть оттуда все, что захотите.
источник
Обратите внимание, что режим открытия файлов - «а» или какой-либо другой алфавит «а» также приведет к ошибке из-за перезаписи.
источник