Otrzymuję ciekawy błąd podczas próby użycia Unpickler.load()
, oto kod źródłowy:
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
Oto śledzenie:
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
Plik, który próbuję odczytać, jest pusty. Jak mogę uniknąć tego błędu i zamiast tego otrzymać pustą zmienną?
open(...).close()
jest tutaj, aby upewnić się, że plik istniejeOdpowiedzi:
Najpierw sprawdziłbym, czy plik nie jest pusty:
Również
open(target, 'a').close()
nic nie robi w twoim kodzie i nie musisz go używać;
.źródło
;
ale właśnie przyszedłem z C i nie używam;
na końcu moich linii, co sprawia, że płaczę TTEOF exception
nie uchroni Cię przed wszystkimi innymi potencjalnymi błędami.Większość odpowiedzi tutaj dotyczy tego, jak zarządzać wyjątkami EOFError, co jest naprawdę przydatne, jeśli nie masz pewności, czy marynowany przedmiot jest pusty, czy nie.
Jeśli jednak jesteś zaskoczony, że plik marynaty jest pusty, może to być spowodowane otwarciem nazwy pliku przez „wb” lub w innym trybie, który mógł nadpisać plik.
na przykład:
Spowoduje to nadpisanie wytrawionego pliku. Mogłeś to zrobić przez pomyłkę przed użyciem:
A potem otrzymałem EOFError, ponieważ poprzedni blok kodu nadpisał plik cd.pkl.
Podczas pracy w Jupyter lub w konsoli (Spyder) zwykle piszę wrapper na czytaniu / pisaniu kodu, a następnie wywołuję wrapper. Pozwala to uniknąć typowych błędów odczytu i zapisu i oszczędza trochę czasu, jeśli zamierzasz wielokrotnie czytać ten sam plik przez travails
źródło
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
To sprawiło, że wygrałeś +1Jak widzisz, to właściwie naturalny błąd.
Typowa konstrukcja do odczytu z obiektu Unpickler wyglądałaby następująco:
EOFError jest po prostu zgłaszany, ponieważ czytał pusty plik, oznaczał po prostu koniec pliku ...
źródło
Jest bardzo prawdopodobne, że marynowany plik jest pusty.
Zaskakująco łatwo jest nadpisać plik marynaty, jeśli kopiujesz i wklejasz kod.
Na przykład następujący zapisuje plik marynaty:
A jeśli kopiowane tego kodu, aby go ponownie otworzyć, ale zapomniał zmian
'wb'
do'rb'
wtedy można zastąpić plik:Prawidłowa składnia to
źródło
źródło
Możesz złapać ten wyjątek i stamtąd zwrócić cokolwiek chcesz.
źródło
Zwróć uwagę, że tryb otwierania plików to „a” lub inne z alfabetem „a” również spowodują błąd z powodu nadpisywania.
źródło