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 estoy intentando leer está vacío. ¿Cómo puedo evitar este error y obtener una variable vacía en su lugar?
open(...).close()
está aquí para garantizar que el archivo existaRespuestas:
Primero comprobaría que el archivo no esté vacío:
Además,
open(target, 'a').close()
no hace nada en su código y no necesita usar;
.fuente
;
pero vengo de C, y no usar;
al final de mis líneas me hace llorar TTEOF exception
no lo salvará de todos los demás errores potenciales.La mayoría de las respuestas aquí tratan sobre cómo administrar las excepciones de EOFError, lo cual es realmente útil si no está seguro de si el objeto en escabeche 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:
Esto sobrescribirá el archivo en escabeche. Es posible que haya hecho esto por error antes de usar:
Y luego obtuve el 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 luego llamo al contenedor. Esto evita errores comunes de lectura y escritura y ahorra un poco de tiempo si va a leer el mismo archivo varias veces a través de sus tribulaciones.
fuente
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
Esto te hizo ganar +1Como puede ver, en realidad es un error natural ...
Una construcción típica para leer de un objeto Unpickler sería así:
EOFError simplemente se genera, porque estaba leyendo un archivo vacío, solo significaba Fin de archivo ...
fuente
Es muy probable que el archivo en escabeche esté vacío.
Es sorprendentemente fácil sobrescribir un archivo pickle si está copiando y pegando código.
Por ejemplo, lo siguiente escribe un archivo pickle:
Y si ha copiado el código para volver a abrirla, pero se olvidó de cambio
'wb'
de'rb'
entonces sería sobrescribir el archivo:La sintaxis correcta es
fuente
fuente
Puede capturar esa excepción y devolver lo que quiera desde allí.
fuente
Tenga en cuenta que el modo de abrir archivos es 'a' o algún otro con el alfabeto 'a' también cometerá un error debido a la sobrescritura.
fuente