J'obtiens une erreur intéressante en essayant d'utiliser Unpickler.load()
, voici le code source:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
Voici le retraçage:
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
Le fichier que j'essaie de lire est vide. Comment éviter d'avoir cette erreur et obtenir une variable vide à la place?
open(...).close()
est là pour s'assurer que le fichier existeRéponses:
Je vérifierais d'abord que le fichier n'est pas vide:
Aussi
open(target, 'a').close()
ne fait rien dans votre code et vous n'avez pas besoin d'utiliser;
.la source
;
mais je viens juste de C, et ne pas utiliser;
à la fin de mes lignes me fait pleurer TTEOF exception
ne vous épargnera pas toutes les autres erreurs potentielles.La plupart des réponses ici ont traité de la façon de gérer les exceptions EOFError, ce qui est vraiment pratique si vous ne savez pas si l'objet mariné est vide ou non.
Cependant, si vous êtes surpris que le fichier pickle soit vide, cela peut être dû au fait que vous avez ouvert le nom de fichier via «wb» ou un autre mode qui aurait pu écraser le fichier.
par exemple:
Cela écrasera le fichier mariné. Vous avez peut-être fait cela par erreur avant d'utiliser:
Et puis obtenu l'EOFError parce que le bloc de code précédent a écrasé le fichier cd.pkl.
Lorsque je travaille dans Jupyter ou dans la console (Spyder), j'écris généralement un wrapper sur le code de lecture / écriture, et j'appelle le wrapper par la suite. Cela évite les erreurs courantes de lecture-écriture et vous fait gagner un peu de temps si vous allez lire le même fichier plusieurs fois à travers vos difficultés.
la source
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
Cela vous a fait gagner +1Comme vous le voyez, c'est en fait une erreur naturelle.
Une construction typique pour la lecture d'un objet Unpickler serait comme ceci.
EOFError est simplement déclenché, car il lisait un fichier vide, cela signifiait simplement Fin de fichier .
la source
Il est très probable que le fichier décapé soit vide.
Il est étonnamment facile d'écraser un fichier pickle si vous copiez et collez du code.
Par exemple, ce qui suit écrit un fichier pickle:
Et si vous avez copié ce code pour le rouvrir, mais a oublié de changer
'wb'
pour'rb'
vous alors remplacer le fichier:La syntaxe correcte est
la source
la source
Vous pouvez attraper cette exception et retourner tout ce que vous voulez à partir de là.
la source
Notez que le mode d'ouverture des fichiers est «a» ou qu'un autre alphabet «a» fera également une erreur en raison de l'écrasement.
la source