2013-03-17 12 views
16

Ho un metodo che scarica un certo numero di oggetti in salamoia (le tuple, in realtà) in un file.pickle - mettendo più di 1 oggetto in un file?

Non voglio metterli in una lista, voglio davvero fare il dump più volte nello stesso file. Il mio problema è, come posso caricare di nuovo gli oggetti? Il primo e il secondo oggetto sono solo una riga, quindi funziona con readlines. Ma tutti gli altri sono più lunghi. naturalmente, se provo

myob = cpickle.load(g1.readlines()[2]) 

dove g1 è il file, ottengo un errore EOF perché il mio oggetto in salamoia è più lungo di una riga. C'è un modo per ottenere solo il mio oggetto in salamoia?

+0

Perché è un problema per metterli tutti in una sola lista? –

risposta

1

Non provare a leggerli come linee del file, solo pickle.load() il numero di oggetti che si desidera. Vedere la mia risposta alla domanda How to save an object in Python per un esempio di farlo.

51

Se si passa il filehandle direttamente in pickle, è possibile ottenere il risultato desiderato.

import pickle 

# write a file 
f = open("example", "w") 
pickle.dump(["hello", "world"], f) 
pickle.dump([2, 3], f) 
f.close() 

f = open("example", "r") 
value1 = pickle.load(f) 
value2 = pickle.load(f) 
f.close() 

pickle.dump aggiungerà alla fine del file, in modo da poter chiamare più volte per scrivere i valori multipli.

pickle.load leggerà solo abbastanza dal file per ottenere il primo valore, lasciando il filehandle aperto e puntato all'inizio dell'oggetto successivo nel file. La seconda chiamata leggerà quindi il secondo oggetto e lascerà il puntatore del file alla fine del file. Una terza chiamata avrà esito negativo con un EOFError come ci si aspetterebbe.

Anche se nel mio esempio ho usato semplicemente il vecchio pickle, questa tecnica funziona allo stesso modo con cPickle.

+0

Vedi anche la risposta per leggere più sottaceti da questa risposta. [Salvataggio e caricamento di più oggetti nel file pickle python] (http://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-python-pickle-file) – salomonvh

+0

funziona anche con cpickle? (apparentemente non ...) – DreamFlasher

13

Penso che il modo migliore sia quello di comprimere i dati in un singolo oggetto prima di memorizzarli e decomprimerlo dopo averlo caricato. Ecco un esempio utilizzando una tupla come il contenitore (you can use dict also):

a = [1,2] 
b = [3,4] 

with open("tmp.pickle", "wb") as f: 
    pickle.dump((a,b), f) 

with open("tmp.pickle", "rb") as f: 
    a,b = pickle.load(f) 
+1

L'op ha detto in particolare 'Non voglio mettere tutti gli oggetti in una lista.' Vuole scriverli in sequenza. –

+0

@Nick: Potrebbe essere vero, ma l'OP non ha detto che non voleva metterli in una 'tupla'. – martineau

Problemi correlati