2013-08-14 14 views
16

Ho una lista che assomiglia a questo:Python salamoia/deserializzazione un elenco a/da un file

a = [['a string', [0, 0, 0], [22, 'bee sting']], ['see string', 
    [0, 2, 0], [22, 'd string']]] 

e sto avendo problemi di salvataggio e il recupero di esso.

posso risparmiare ok con salamoia:

with open('afile','w') as f: 
    pickle.dump(a,f) 

ma ottenere il seguente errore quando provo a caricarlo:

pickle.load('afile') 

Traceback (most recent call last): 
    File "<pyshell#116>", line 1, in <module> 
    pickle.load('afile') 
    File "C:\Python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "C:\Python27\lib\pickle.py", line 841, in __init__ 
    self.readline = file.readline 
AttributeError: 'str' object has no attribute 'readline' 

avevo pensato che avrei potuto convertire in una matrice NumPy e utilizzare save, savez o savetxt. Tuttavia ho il seguente errore:

>>> np.array([a]) 

Traceback (most recent call last): 
    File "<pyshell#122>", line 1, in <module> 
    np.array([a]) 
ValueError: cannot set an array element with a sequence 
+5

Invece di pickle.load ('afile') fare pickle.load (aperta ('afile')) –

+0

Certo! grazie - Perché non lo metti come risposta .. – atomh33ls

+0

Non puoi convertire facilmente ciò che hai in un 'numpy.array' dato che ha una forma irregolare. Dovresti creare un grande array regolare e poi riempire tutti i dati con 'NaN' o qualcosa del genere ... essenzialmente ciò che' pandas' fa per te. Probabilmente è eccessivo per la tua piccola lista, comunque. –

risposta

31

Ho deciso di farlo come risposta. Il metodo pickle.load si aspetta di ottenere un file come oggetto, ma si fornisce invece una stringa e quindi un'eccezione. Così, invece di:

pickle.load('afile') 

si dovrebbe fare:

pickle.load(open('afile', 'rb')) 
+2

forse 'open ('afile', 'rb')'. Nota dalla documentazione 'pickle': * Assicurarsi di aprire sempre i file pickle creati con i protocolli> = 1 in modalità binaria. * – cdarke

13

Per aggiungere a @ risposta di Rapolas K:

ho scoperto che ho avuto problemi con il file non chiude in modo usato questo metodo:

with open('afile','rb') as f: 
    pickle.load(f)