2012-10-06 13 views
13

Ho bisogno di aggiungere un file di pickle (dato che non ho l'intero dizionario con me in una volta sola). Così, per fare la stessa cosa che ho scritto il seguente codice:Come usare append con pickle in python?

import pickle 
p={} 
p[1]=2 
q={} 
q['a']=p 
p={} 
p[2]=0 
pickle.dump(q, open("save12.p","ab")) 
f={} 
f['b']=p 
pickle.dump(f,open("save12.p","ab")) 

Tuttavia, quando sto caricando il file di salamoia non trovo il valore del dizionario f lì ?????

Qualcuno può suggerire per favore come devo fare per appendere in un file di pickle ???

basi di dati anche come 'dbm' non stanno lavorando per il mio bisogno come sto lavorando su Windows

+0

Cosa ti fa pensare che due allegato i flussi di sottaceti saranno in qualche modo accettati magicamente come un nuovo oggetto? Se i tuoi dati sono troppo grandi per adattarsi alla memoria, usa un database (hai molte scelte, dbm non è l'unica cosa là fuori). –

+0

Il ['ZODB'] (http://www.zodb.org/) funziona bene su Windows; immagazzina anche sottaceti. –

+0

@Chris sono davvero nuovo in Python ... quindi puoi aiutarmi suggerendo alcuni database o dando l'esempio ,,, sarebbe davvero fantastico –

risposta

36

flussi Pickle sono completamente autonomo, e così deserializzazione sarà deserializzazione un oggetto alla volta.

Pertanto, da deserializzare più flussi, si dovrebbe più volte deserializzare il file fino ad ottenere un'EOFError:

>>> f=open('a.p', 'wb') 
>>> pickle.dump({1:2}, f) 
>>> pickle.dump({3:4}, f) 
>>> f.close() 
>>> 
>>> f=open('a.p', 'rb') 
>>> pickle.load(f) 
{1: 2} 
>>> pickle.load(f) 
{3: 4} 
>>> pickle.load(f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
EOFError 

così il vostro codice di deserializzazione potrebbe essere simile

import pickle 
objs = [] 
while 1: 
    try: 
     objs.append(pickle.load(f)) 
    except EOFError: 
     break