¿Cómo leer el archivo pickle?

85

Creé algunos datos y los almacené varias veces así:

with open('filename', 'a') as f:
        pickle.dump(data, f)

Cada vez que aumenta el tamaño del archivo, pero cuando abro el archivo

with open('filename', 'rb') as f:
    x = pickle.load(f)

Solo puedo ver los datos de la última vez. ¿Cómo puedo leer el archivo correctamente?

Kenenbek Arzymatov
fuente
1
Está agregando objetos a su archivo. Cuando se quita, se quita la primera entrada. ¿Estás seguro de que necesitas todas esas entradas? Si no es así - el cambio aopen('filename', 'wb')
Andrey
Sí, necesito todas las entradas. El tamaño de los archivos muestra que lo contiene todo.
Kenenbek Arzymatov
1
Entonces @jsbueno tiene razón en su respuesta.
Andrey
Creé
Christo S. Christov

Respuestas:

91

Pickle serializa un solo objeto a la vez y vuelve a leer un solo objeto: los datos decapados se registran en secuencia en el archivo.

Si simplemente lo hace pickle.load, debería leer el primer objeto serializado en el archivo (no el último como lo ha escrito).

Después de anular la serialización del primer objeto, el puntero de archivo está al principio del siguiente objeto; si simplemente pickle.loadvuelve a llamar , leerá el siguiente objeto, hágalo hasta el final del archivo.

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break
jsbueno
fuente
21

Hay una función read_pickle como parte de pandas 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')
Taylrl
fuente
6

El siguiente es un ejemplo de cómo puede escribir y leer un archivo pickle. Tenga en cuenta que si sigue agregando datos de pickle al archivo, deberá continuar leyendo desde el archivo hasta que encuentre lo que desea o se genere una excepción al llegar al final del archivo. Eso es lo que hace la última función.

import os
import pickle


PICKLE_FILE = 'pickle.dat'


def main():
    # append data to the pickle file
    add_to_pickle(PICKLE_FILE, 123)
    add_to_pickle(PICKLE_FILE, 'Hello')
    add_to_pickle(PICKLE_FILE, None)
    add_to_pickle(PICKLE_FILE, b'World')
    add_to_pickle(PICKLE_FILE, 456.789)
    # load & show all stored objects
    for item in read_from_pickle(PICKLE_FILE):
        print(repr(item))
    os.remove(PICKLE_FILE)


def add_to_pickle(path, item):
    with open(path, 'ab') as file:
        pickle.dump(item, file, pickle.HIGHEST_PROTOCOL)


def read_from_pickle(path):
    with open(path, 'rb') as file:
        try:
            while True:
                yield pickle.load(file)
        except EOFError:
            pass


if __name__ == '__main__':
    main()
Noctis Skytower
fuente
6

Desarrollé una herramienta de software que abre (la mayoría) los archivos de Pickle directamente en su navegador (no se transfiere nada, por lo que es 100% privado):

https://pickleviewer.com/

Christo S. Christov
fuente
-25

No estás haciendo nada con él, solo estás cargando el archivo.

for line in x:
    print x

imprimirá cada línea. (En el segundo con el enunciado)

Eric MacLeod
fuente