2016-01-28 10 views
12

Ho creato alcuni dati memorizzati e più volte come questo:Come leggere il file pickle?

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

Ogni volta che la dimensione del file di aumento, ma quando il file

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

apro guardo solo i dati dall'ultima volta. Come posso leggere correttamente il file?

+1

Stai aggiungendo oggetti al tuo file. Quando non si priva di spunti, deseleziona solo la prima voce. Sei sicuro di aver bisogno di tutte quelle voci? In caso contrario, passare a 'open ('filename', 'wb')' – Andrey

+0

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

+1

Quindi @jsbueno ha ragione nella sua risposta. – Andrey

risposta

21

Pickle serializza un singolo oggetto alla volta e legge un singolo oggetto - i dati in salamoia sono registrati in sequenza sul file.

Se si fa semplicemente pickle.load si dovrebbe leggere il primo oggetto serializzato nel file (non l'ultimo come hai scritto).

Dopo deserializzazione, il primo oggetto, il file-puntatore è al beggining dell'oggetto successivo - se è sufficiente chiamare pickle.load ancora una volta, si leggerà che prossimo oggetto - farlo fino alla fine del file.

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

il tuo non fare nulla con esso il tuo unico caricamento del file.

for line in x: 
    print x 

stampa ogni riga. (Nel secondo con estratto)

2

Il seguente è un esempio di come è possibile scrivere e leggere un file pickle. Nota che se continui ad accodare i dati di pickle al file, dovrai continuare a leggere dal file finché non trovi ciò 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()