Beim Versuch, es zu verwenden Unpickler.load()
, wird ein interessanter Fehler angezeigt . Hier ist der Quellcode:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
Hier ist der Traceback:
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
Die Datei, die ich zu lesen versuche, ist leer. Wie kann ich diesen Fehler vermeiden und stattdessen eine leere Variable erhalten?
open(...).close()
ist hier, um sicherzustellen, dass die Datei existiertAntworten:
Ich würde zuerst überprüfen, ob die Datei nicht leer ist:
Auch
open(target, 'a').close()
tut nichts in Ihrem Code und Sie müssen nicht verwenden;
.quelle
;
aber ich komme gerade von C, und wenn ich sie nicht;
am Ende meiner Zeilen verwende, weine ich TTEOF exception
wird Sie nicht vor allen anderen möglichen Fehlern bewahren.Die meisten Antworten hier haben sich mit dem Verwalten von EOFError-Ausnahmen befasst. Dies ist sehr praktisch, wenn Sie sich nicht sicher sind, ob das eingelegte Objekt leer ist oder nicht.
Wenn Sie jedoch überrascht sind, dass die Pickle-Datei leer ist, kann dies daran liegen, dass Sie den Dateinamen über 'wb' oder einen anderen Modus geöffnet haben, der die Datei möglicherweise überschrieben hat.
beispielsweise:
Dadurch wird die eingelegte Datei überschrieben. Möglicherweise haben Sie dies versehentlich getan, bevor Sie Folgendes verwendet haben:
Und dann den EOFError bekommen, weil der vorherige Codeblock die Datei cd.pkl überschrieben hat.
Wenn ich in Jupyter oder in der Konsole (Spyder) arbeite, schreibe ich normalerweise einen Wrapper über den Lese- / Schreibcode und rufe den Wrapper anschließend auf. Dies vermeidet häufige Lese- / Schreibfehler und spart ein wenig Zeit, wenn Sie dieselbe Datei mehrmals durch Ihre Schwierigkeiten lesen
quelle
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
Dies brachte Sie dazu, +1Wie Sie sehen, ist das eigentlich ein natürlicher Fehler.
Ein typisches Konstrukt zum Lesen aus einem Unpickler-Objekt wäre wie folgt.
EOFError wird einfach ausgelöst, weil es eine leere Datei las, es bedeutete nur Dateiende .
quelle
Es ist sehr wahrscheinlich, dass die eingelegte Datei leer ist.
Es ist überraschend einfach, eine Pickle-Datei zu überschreiben, wenn Sie Code kopieren und einfügen.
Zum Beispiel schreibt das Folgende eine Pickle-Datei:
Und wenn Sie diesen Code kopiert haben, um ihn erneut zu öffnen, aber vergessen haben, ihn zu ändern
'wb'
,'rb'
würden Sie die Datei überschreiben:Die richtige Syntax lautet
quelle
quelle
Sie können diese Ausnahme abfangen und von dort aus alles zurückgeben, was Sie möchten.
quelle
Beachten Sie, dass der Modus zum Öffnen von Dateien 'a' ist oder ein anderes Alphabet 'a' aufgrund des Überschreibens ebenfalls Fehler macht.
quelle