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?

36
demandé sur Magix 2014-07-17 02:35:42

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 ;.

41
répondu Padraic Cunningham 2017-09-10 10:15:17

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

19
répondu Abhay Nainan 2018-07-28 07:58:37

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 ..

3
répondu Amr Ayman 2017-09-10 10:16:44

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 {}
1
répondu jramirez 2014-07-16 22:39:26
if path.exists(Score_file):
      try : 
         with open(Score_file , "rb") as prev_Scr:

            return Unpickler(prev_Scr).load()

    except EOFError : 

        return dict() 
0
répondu jukoo 2018-03-30 21:19:17