2013-09-07 14 views
5

In un piccolo progetto di acquisizione dati utilizziamo pickle dati per memorizzare registrati del pitone, ossia per ogni "evento" si aggiunge al file di output f conCarica i dati dal file pickle Python in un ciclo?

pkl.dump(event, f, pkl.HIGHEST_PROTOCOL) 

dove import cPickle as pkl.

Nell'analisi dei dati che leggiamo ogni evento, ma a differenza di un normale file in cui l'elaborazione può essere uno in un modo piuttosto elegante:

with open(filename) as f: 
    for line in f: 
     do_something() 

loop su tutti i dati in un file salamoia questo diventa un po 'più scomodo:

with open(filename) as f: 
    try: 
     while True: 
      event = pkl.load(f) 
      do_something() 
    except (EOFError, UnpicklingError): 
     pass 

E' possibile rendere la lettura più salamoia come l'esempio per i file normali di cui sopra?

risposta

9

Sì, davvero. Utilizzare questo generatore di seguito per rendere gli eventi leggibili in un ciclo:

def pickleLoader(pklFile): 
    try: 
     while True: 
      yield pkl.load(pklFile) 
    except EOFError: 
     pass 

Ora si può semplicemente scrivere:

with open(filename) as f: 
    for event in pickleLoader(f): 
     do_something()