Come leggere il file pickle?


91

Ho creato alcuni dati e li ho memorizzati più volte in questo modo:

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

Ogni volta che la dimensione del file è aumentata, ma quando apro il file

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

Posso vedere solo i dati dell'ultima volta. Come posso leggere correttamente il file?


1
Stai aggiungendo oggetti al tuo file. Quando non apparisci, annulli solo la prima voce. Sei sicuro di aver bisogno di tutte quelle voci? In caso contrario, cambia inopen('filename', 'wb')
Andrey

Sì, ho bisogno di tutte le voci. La dimensione dei file mostra che contiene tutto.
Kenenbek Arzymatov

1
Quindi @jsbueno ha ragione nella sua risposta.
Andrey


Ho creato qualcosa per visualizzare i file pickle direttamente nel tuo browser: pickleviewer.com
Christo S. Christov

Risposte:


98

Pickle serializza un singolo oggetto alla volta e rilegge un singolo oggetto: i dati decapati vengono registrati in sequenza sul file.

Se lo fai semplicemente pickle.loaddovresti leggere il primo oggetto serializzato nel file (non l'ultimo come hai scritto).

Dopo aver annullato la serializzazione del primo oggetto, il puntatore del file si trova all'inizio dell'oggetto successivo - se chiami di pickle.loadnuovo, leggerà l'oggetto successivo - fallo fino alla fine del file.

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

27

C'è una funzione read_pickle come parte di panda 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')

6

Quello che segue è un esempio di come potresti scrivere e leggere un file pickle. Nota che se continui ad aggiungere dati pickle al file, dovrai continuare a leggere dal file fino a quando non trovi quello che desideri o viene generata un'eccezione raggiungendo la fine del file. Questo è ciò che fa l'ultima funzione.

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()


-27

Non stai facendo nulla con esso, stai solo caricando il file.

for line in x:
    print x

stamperà ogni riga. (Nella seconda con l'affermazione)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.