python file pickle

python - pickle-¿poner más de 1 objeto en un archivo?



modulo pickle python (3)

Creo que la mejor manera es empaquetar sus datos en un solo objeto antes de almacenarlos y descomprimirlos después de cargarlos. Aquí hay un ejemplo usando una tupla como contenedor ( 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)

Esta pregunta ya tiene una respuesta aquí:

Tengo un método que descarga un número de objetos decapados (tuplas, en realidad) en un archivo.

No quiero ponerlos en una lista, realmente quiero volcar varias veces en el mismo archivo. Mi problema es, ¿cómo puedo cargar los objetos de nuevo? El primer y segundo objeto solo tienen una línea, por lo que esto funciona con líneas de lectura. Pero todos los demás son más largos. naturalmente, si lo intento

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

donde g1 es el archivo, recibo un error EOF porque mi objeto encurtido es más largo que una línea. ¿Hay una manera de obtener sólo mi objeto en escabeche?


No intente volver a leerlos como líneas del archivo, simplemente pickle.load() el número de objetos que desea. Vea mi respuesta a la pregunta Cómo guardar un objeto en Python para ver un ejemplo de cómo hacerlo.


Si pasa el identificador de archivo directamente a Pickle, puede obtener el resultado que desea.

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 se pickle.dump al final del archivo, por lo que puede llamarlo varias veces para escribir varios valores.

pickle.load leerá solo lo suficiente del archivo para obtener el primer valor, dejando el pickle.load de archivo abierto y apuntando al inicio del siguiente objeto en el archivo. La segunda llamada leerá el segundo objeto y dejará el puntero del archivo al final del archivo. Una tercera llamada fallará con un EOFError como usted esperaría.

Aunque en mi ejemplo usé pickle antiguo, esta técnica funciona igual con cPickle .