python - largos - ¿Cómo hacer cickick dump y cargar diccionarios separados en el mismo archivo?
comics en ingles largos pdf (3)
Tengo un proceso que ejecuta y crea tres diccionarios: 2 bastante pequeños y 1 grande.
Sé que puedo almacenar un diccionario como:
import cPickle as pickle
with open(filename, ''wb'') as fp:
pickle.dump(self.fitResults, fp)
Lo que me gustaría hacer es almacenar los 3 diccionarios en el mismo archivo, con la capacidad de cargar los tres diccionarios por separado en otro momento. Algo como
with open(filename, ''rb'') as fp:
dict1, dict2, dict3 = pickle.load(fp)
O incluso mejor, simplemente cargue los dos primeros diccionarios, y haga que sea opcional cargar el tercero (grande). ¿Es esto posible o debería hacerlo de una manera completamente diferente?
Claro, solo debes descargar cada uno por separado y luego cargarlos por separado:
with open(filename,''wb'') as fp:
pickle.dump(dict1,fp)
pickle.dump(dict2,fp)
pickle.dump(dict3,fp)
with open(filename,''rb'') as fp:
d1=pickle.load(fp)
d2=pickle.load(fp)
d3=pickle.load(fp)
Asegúrate de volcar lo grande para que puedas cargar los pequeños sin cargar primero el grande. Me imagino que incluso podría ser inteligente y almacenar las posiciones de los archivos donde comienza cada volcado en un encabezado de clases y luego podría buscar esa ubicación antes de cargar (pero eso está empezando a ser un poco más complicado).
Como se mencionó here , puedes encurtir varios objetos en el mismo archivo y cargarlos todos (en el mismo orden):
f = file(filename, ''wb'')
for obj in [dict1, dict2, dict3]:
cPickle.dump(obj, f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()
Entonces:
f = file(filename, ''rb'')
loaded_objects = []
for i in range(3):
loaded_objects.append(cPickle.load(f))
f.close()
Puede guardar sus diccionarios en un orden específico para que al cargarlos, tenga la opción de seleccionar solo los preferidos.
Por ejemplo, si almacena diccionarios en el orden: smallDict1
, smallDict2
, largeDict1
Puede cargar solo los pequeños configurando el rango apropiado al cargar
(Aquí for i in range(2) ...
)
Recomiendo el módulo de shelve
, que a menudo se olvida, que le proporciona un diccionario persistente respaldado por el archivo Berkley DB o el archivo dbm (según lo seleccionado por anydbm
). La base de datos debe proporcionar mejoras de rendimiento (para su gran diccionario).
Ejemplo de uso:
import shelve
shelf = shelve.open(''my_shelf'')
>>> shelf
{}
# add your dictionaries (or any pickleable objects)
shelf[''dict1''] = dict(a=10, b=20, c=30, l=[10, 20, 30])
shelf[''dict2''] = dict(a=100, b=200, c=300, l=[100, 200, 300])
shelf[''dict3''] = dict(a=1000, b=2000, c=3000, l=[1000, 2000, 3000])
>>> shelf
{''dict1'': {''a'': 10, ''c'': 30, ''b'': 20, ''l'': [10, 20, 30]}, ''dict3'': {''a'': 1000, ''c'': 3000, ''b'': 2000, ''l'': [1000, 2000, 3000]}, ''dict2'': {''a'': 100, ''c'': 300, ''b'': 200, ''l'': [100, 200, 300]}}
shelf.close()
# then, later
shelf = shelve.open(''my_shelf'')
>>> shelf
{''dict1'': {''a'': 10, ''c'': 30, ''b'': 20, ''l'': [10, 20, 30]}, ''dict3'': {''a'': 1000, ''c'': 3000, ''b'': 2000, ''l'': [1000, 2000, 3000]}, ''dict2'': {''a'': 100, ''c'': 300, ''b'': 200, ''l'': [100, 200, 300]}}