2009-03-31 10 views
5

Ho il seguente frammento di codice:EOFError in Python sceneggiatura

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 

E 'l'errore:

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 

Che cosa sto facendo di sbagliato?

risposta

14

A meno che non hai un errore di battitura, il problema potrebbe essere in questa linea in cui si assegna l'handle di file per selffp non self.fp:

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

Se questo è un errore di battitura, e il codice in realtà apre il file a self.fp, quindi potreste voler verificare che il file abbia effettivamente dei contenuti (cioè: che il pickle precedente abbia funzionato) ... l'errore suggerisce che il file è vuoto.

Modifica: nei commenti a questa risposta, S. Lott ha un bel riepilogo del motivo per cui l'errore di battitura ha generato l'errore che hai visto che sto incollando qui per la completezza della risposta: "selffp sarà il file aperto non utilizzato, e self.fp (il vecchio file chiuso) sarà usato per il carico ".

+0

+1: posto eccellente. selffp sarà il file aperto non utilizzato e self.fp (il vecchio file chiuso) verrà utilizzato per il caricamento. –

5

Ecco la versione che mi consiglia di utilizzare:

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 

Come è stato sottolineato, c'era un errore di battitura su self.fp. Ma ecco alcune altre cose che noto che possono causare problemi.

Prima di tutto, è shouldn't be using the file constructor directly. Dovresti invece usare la funzione open built.

In secondo luogo, si dovrebbe evitare di chiamare il metodo close di un file al di fuori di un blocco finally. In questo caso, ho usato Python 2.6 con un blocco. È possibile utilizzare questo in Python 2.5 con il seguente comando:

from __future__ import with_statement 

Questo consentirà di evitare che il file venga bloccato aperta se viene generata un'eccezione da nessuna parte (come sarà chiudere il file quando il con il blocco si esce). Sebbene questa non sia la causa del tuo problema, è una cosa importante da ricordare perché se uno dei metodi dell'oggetto file genera un'eccezione, il file verrà mantenuto aperto in sys.traceback a tempo indeterminato.

(si noti che probabilmente si dovrebbe accettare la risposta di Jarret Hardie, però, ha catturato il bug :-))

+0

+1: molto più pulito e con buoni consigli sugli altri problemi nello snippet –

0

Mentre questa non è una risposta diretta alla domanda del PO - Sono capitato in questa risposta durante la ricerca di un motivo di un EOFError durante il tentativo di annullare il prelievo di un file binario con: 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

ho ottenuto questo errore quando non ho scelto la modalità corretta per leggere il file (wb invece di rb). Il passaggio a rb non è stato sufficiente per risolvere il problema. Tuttavia, la generazione di un nuovo file clean pickle ha risolto il problema. Sembra che non scegliere la modalità corretta per aprire il file binario in qualche modo "danneggia" il file che non è quindi apribile in seguito.

Ma io sono un principiante con Python, quindi potrei aver perso anche qualcosa.

Problemi correlati