Pourquoi est - ce que J'ai "Pickle-EOFError: Ran out of input" qui lit un fichier vide?
je suis un intéressant erreur lors de la tentative 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 traceback:
Traceback (most recent call last):
File "G:pythonpenduuser_test.py", line 3, in <module>:
save_user_points("Magix", 30);
File "G:pythonpenduuser.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 peut-on éviter cette erreur, et obtenir une variable vide à la place?
5 réponses
je voudrais vérifier que le fichier n'est pas vide d'abord:
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()
ne fait rien dans votre code et vous n'avez pas besoin d'utiliser ;
.
la plupart des réponses ici ont porté sur la façon de gérer les exceptions EOFError, ce qui est vraiment pratique si vous n'êtes pas sûr si l'objet décapité est vide ou non.
cependant, si vous êtes surpris que le fichier de pickle soit vide, c'est peut-être parce que vous avez ouvert le nom du fichier via 'wb' ou un autre mode qui aurait pu surcharger le fichier.
par exemple:
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
Cela effacera la marinés fichier. Vous pourriez avoir fait par erreur avant de l'utiliser:
...
open(filename, 'rb') as f:
et ensuite obtenu L'EOFError parce que le bloc de code précédent sur-Écrit le cd.dossier pkl.
lorsque je travaille sur Jupyter, ou sur la console (Spyder), j'écris habituellement 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 économise un peu de temps si vous allez lire le même fichier plusieurs fois à travers vos travaux
Comme vous le voyez, c'est en fait un naturel erreur ..
une construction typique pour lire à partir d'un objet Unpickler serait comme ceci ..
try:
data = unpickler.load()
except EOFError:
data = list() # or whatever you want
EOFError est simplement soulevé, parce qu'il lisait un fichier vide, il voulait juste dire fin du fichier ..
Vous pouvez attraper cette exception et retourner ce que vous voulez de là.
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 {}
if path.exists(Score_file):
try :
with open(Score_file , "rb") as prev_Scr:
return Unpickler(prev_Scr).load()
except EOFError :
return dict()