Estou recebendo um erro interessante ao tentar usar Unpickler.load()
, aqui está o código-fonte:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
Aqui está o traceback:
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
O arquivo que estou tentando ler está vazio. Como posso evitar esse erro e, em vez disso, obter uma variável vazia?
open(...).close()
está aqui para garantir que o arquivo existeRespostas:
Gostaria de verificar se o arquivo não está vazio primeiro:
Também não
open(target, 'a').close()
está fazendo nada em seu código e você não precisa usar;
.fonte
;
mas acabei de chegar de C, e não usar;
no final das minhas linhas me faz chorar TTEOF exception
não o salvará de todos os outros erros potenciais.A maioria das respostas aqui tratou de como gerenciar exceções EOFError, o que é realmente útil se você não tiver certeza se o objeto em conserva está vazio ou não.
No entanto, se você estiver surpreso que o arquivo pickle esteja vazio, pode ser porque você abriu o nome do arquivo por meio de 'wb' ou algum outro modo que poderia ter sobrescrito o arquivo.
por exemplo:
Isso substituirá o arquivo em conserva. Você pode ter feito isso por engano antes de usar:
E então obteve o EOFError porque o bloco de código anterior sobrescreveu o arquivo cd.pkl.
Quando trabalho no Jupyter ou no console (Spyder), geralmente escrevo um wrapper sobre o código de leitura / gravação e chamo o wrapper posteriormente. Isso evita erros comuns de leitura e gravação e economiza um pouco de tempo se você for ler o mesmo arquivo várias vezes durante o trabalho
fonte
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
Isso fez você ganhar +1Como você pode ver, isso é realmente um erro natural.
Uma construção típica para leitura de um objeto Unpickler seria assim ..
EOFError é simplesmente gerado, porque estava lendo um arquivo vazio, significava apenas Fim do arquivo ..
fonte
É muito provável que o arquivo em conserva esteja vazio.
É surpreendentemente fácil substituir um arquivo pickle se você estiver copiando e colando o código.
Por exemplo, o seguinte grava um arquivo pickle:
E se você copiou este código para reabri-lo, mas se esqueceu de mudar
'wb'
para'rb'
, você substituiria o arquivo:A sintaxe correta é
fonte
fonte
Você pode capturar essa exceção e retornar o que quiser de lá.
fonte
Observe que o modo de abertura de arquivos é 'a' ou algum outro com alfabeto 'a' também causará erro devido à substituição.
fonte