2012-10-06 26 views
13

necesito agregar a un archivo de pickle (ya que no tengo todo el diccionario conmigo de una vez). Así que para hacer lo mismo que he escrito el siguiente código:Cómo usar append with pickle en 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")) 

Sin embargo, cuando estoy cargando el archivo de salmuera que no encuentran el valor de f diccionario no ?????

¿Puede alguien sugerir por favor cómo debo ir sobre anexar en un archivo de salmuera ???

también bases de datos como 'dBm' no están funcionando para mi necesidad como estoy trabajando en ventanas

+0

Qué le hace pensar que dos adjunta las corrientes de pickles de alguna manera serán mágicamente aceptadas como un nuevo objeto? Si sus datos son demasiado grandes para caber en la memoria, use una base de datos (tiene muchas opciones, dbm no es lo único que existe). –

+0

El ['ZODB'] (http://www.zodb.org/) funciona bien en Windows; almacena pepinillos también. –

+0

@Chris soy muy nuevo en python ... así que puedes ayudarme sugiriendo algunas bases de datos o dando un ejemplo ,,, eso sería realmente genial –

Respuesta

36

corrientes de la salmuera son totalmente autónomo, y así se deserialiación unpickle un objeto a la vez.

Por lo tanto, a unpickle múltiples flujos, debe repetidamente unpickle el archivo hasta que obtener una 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 

lo que el código unpickle podría parecerse

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