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
.