¿Por qué aparece el mensaje "Pickle - EOFError: Se quedó sin entrada" al leer un archivo vacío?
Recibo un error interesante al intentar usar Unpickler.load()
, aquí está el código fuente:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
Aquí está el rastreo:
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
El archivo que intento leer está vacío. ¿Cómo puedo evitar recibir este error y obtener una variable vacía en su lugar?
La mayoría de las respuestas aquí tratan sobre cómo gestionar las excepciones de EOFError, lo cual es realmente útil si no está seguro de si el objeto encurtido está vacío o no.
Sin embargo, si le sorprende que el archivo pickle esté vacío, podría deberse a que abrió el nombre del archivo a través de 'wb' o algún otro modo que podría haber sobrescrito el archivo.
Por ejemplo:
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
Esto sobrescribirá el archivo encurtido. Es posible que hayas hecho esto por error antes de usar:
...
open(filename, 'rb') as f:
Y luego obtuve el error EOFError porque el bloque de código anterior sobrescribió el archivo cd.pkl.
Cuando trabajo en Jupyter o en la consola (Spyder), normalmente escribo un contenedor sobre el código de lectura/escritura y llamo al contenedor posteriormente. Esto evita errores comunes de lectura y escritura y ahorra un poco de tiempo si va a leer el mismo archivo varias veces durante sus dificultades.
Primero comprobaría que el archivo no esté vacío:
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()
Además open(target, 'a').close()
, no hace nada en su código y no necesita usarlo ;
.
Es muy probable que el archivo encurtido esté vacío.
Es sorprendentemente fácil sobrescribir un archivo pickle si estás copiando y pegando código.
Por ejemplo, lo siguiente escribe un archivo pickle:
pickle.dump(df,open('df.p','wb'))
Y si copió este código para volver a abrirlo, pero olvidó cambiarlo, 'wb'
sobrescribirá 'rb'
el archivo:
df=pickle.load(open('df.p','wb'))
La sintaxis correcta es
df=pickle.load(open('df.p','rb'))