2009-03-31 16 views
5

Mam następujący fragment kodu:EOFError w Pythonie skrypt

def database(self): 
    databasename="" 
    host="" 
    user="" 
    password="" 
    try: 
     self.fp=file("detailing.dat","rb") 
    except IOError: 
     self.fp=file("detailing.dat","wb") 
     pickle.dump([databasename,host,user,password],self.fp,-1) 
     self.fp.close() 
     selffp=file("detailing.dat","rb") 
     [databasename,host,user,password]=pickle.load(self.fp) 

    return 

To błąd:

Traceback (most recent call last): 
    File "detailing.py", line 91, in ? 
    app=myApp() 
    File "detailing.py", line 20, in __init__ 
    wx.App.__init__(self,redirect,filename,useBestVisual,clearSigInt) 
    File "/usr/lib64/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7473, in __init__ 
    self._BootstrapApp() 
    File "/usr/lib64/python2.4/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7125, in _BootstrapApp 
    return _core_.PyApp__BootstrapApp(*args, **kwargs) 
    File "detailing.py", line 33, in OnInit 
    self.database() 
    File "detailing.py", line 87, in database 
    [databasename,host,user,password]=pickle.load(self.fp) 
    File "/usr/lib64/python2.4/pickle.py", line 1390, in load 
    return Unpickler(file).load() 
    File "/usr/lib64/python2.4/pickle.py", line 872, in load 
    dispatch[key](self) 
    File "/usr/lib64/python2.4/pickle.py", line 894, in load_eof 
    raise EOFError 
EOFError 

Co robię źle?

Odpowiedz

14

ile masz literówkę, problem może być w tym wierszu, w którym przydziela uchwyt pliku do selffp nie self.fp:

selffp=file("detailing.dat","rb") 

jeśli jest to literówka, a Twój kod faktycznie otwiera plik do self.fp, możesz chcieć sprawdzić, czy plik rzeczywiście zawiera zawartość (np. że poprzednia pikle działała) ... błąd sugeruje, że plik jest pusty.

Edytuj: W komentarzach do tej odpowiedzi S. Lott ma ładne podsumowanie tego, dlaczego literówka wygenerowała błąd, który zobaczyłem, wklejałem tutaj dla kompletności odpowiedzi: "selffp będzie nieużywanym otworzonym plikiem, i self.fp (stary zamknięty plik) zostanie użyty do obciążenia ".

+0

+1: Doskonałe miejsce. selffp będzie nieużywanym otworzonym plikiem, a self.fp (stary zamknięty plik) zostanie użyty do załadowania. –

5

Oto wersja Polecam przy użyciu:

def database(self): 
    databasename="" 
    host="" 
    user="" 
    password="" 
    try: 
     self.fp=open("detailing.dat","rb") 
    except IOError: 
     with open("detailing.dat", "wb") as fp: 
      pickle.dump([databasename,host,user,password],fp,-1) 

     self.fp=open("detailing.dat","rb") 
     [databasename,host,user,password]=pickle.load(self.fp) 

    return 

Jak zostało wskazane, była literówka na self.fp. Ale oto kilka innych rzeczy, które zauważam, które mogą powodować problemy.

Przede wszystkim jesteś shouldn't be using the file constructor directly. Zamiast tego należy użyć wbudowanej funkcji otwartej.

Po drugie, należy unikać wywoływania metody zamykania pliku poza blokiem finally. W tym przypadku użyłem Pythona 2.6 z blokiem. Można to wykorzystać w Pythonie 2.5 za pomocą następującego polecenia:

from __future__ import with_statement 

To zapobiegnie plik z tkwić otwarty jeśli jest wyjątek wszędzie (jak to będzie zamknąć plik po wyjściu z bloku). Chociaż nie jest to przyczyną problemu, ważne jest, aby pamiętać, ponieważ jeśli jedna z metod obiektu pliku zgłasza wyjątek, plik zostanie otwarty w sys.traceback na czas nieokreślony.

(zauważ, że powinieneś przyjąć odpowiedź Jarret Hardie jest jednak złapał :-) bug)

+0

+1: dużo czystszy i z dobrą radą na temat innych problemów w opisie –

0

Choć nie jest to bezpośrednia odpowiedź na pytanie OP - ja się na to odpowiedź w poszukiwaniu powodem EOFError podczas próby rozpakowania pliku binarnego za pomocą: pickle.load(open(filename, "r")).

import cPickle as pickle 
A = dict((v, i) for i, v in enumerate(words)) 
with open("words.pkl", "wb") as f: 
    pickle.dump(A, f) 



#...later open the file -- mistake:trying to read a binary with non-binary method 
with open("words.pkl", "r") as f: 
    A =pickle.load(f) # EOFError 


# change that to 
with open ("words.pkl", "rb") as f: # notice the "rb" instead of "r" 
    A = pickle.load(f) 
1

mam ten błąd, gdy nie wybrał odpowiedni tryb do odczytu pliku (wb zamiast rb). Zmiana z powrotem na rb nie była wystarczająca, aby rozwiązać problem. Jednak ponowne wygenerowanie nowego czystego pliku pikla rozwiązało problem. Wygląda na to, że nie wybranie prawidłowego trybu otwierania pliku binarnego w jakiś sposób "uszkadza" plik, który potem nie może być później otworzony.

Ale jestem dość początkujący w Pythonie, więc być może też coś przeoczyłem.

Powiązane problemy