2016-04-28 8 views
-1

Ich versuche, eine Binärdatei ein Stück nach dem anderen zu lesen. Jedes Mal, wenn der Generator 1024 Bytes an Daten erzeugen würde. Wenn ich aufhören will, rufe ich den Generator mit .send ('Stop') an. Ich bekomme die Ausgabe korrekt, aber ich bekomme eine Ausnahme. Mache ich etwas falsch oder wird das erwartet? Wie gehe ich damit um?StopIteration Fehler nach dem Ausbrechen eines Generators

def read_epoch_from_file(filename,size=1024): 
    with open(filename, "rb") as f: 
     while True: 
      read_data = f.read(size) 
      if read_data: 
       y = yield read_data 
       if y == 'Stop': 
        print 'Stopped' 
        break 
      else: 
       break 
     print 'End' 
     f.close() 
     return 

gen = read_epoch_from_file("Test") 
readdata_ascii = next(gen) 
#do somthing 
readdata_ascii = next(gen) 
#do somthing 
readdata_ascii = next(gen) 
#do somthing 
gen.send('Stop') 

Ausgang

gesehen
Stopped 
End 

Traceback (most recent call last): 
    File "C:\CVS sandbox\Mandela2\Extractor\binary_parser.py", line 50, in <module> 
    gen.send('Stop') 
StopIteration 

Antwort

0

Aus meinem den StopIteration Verständnis immer durch den Generator erzeugt wird, wenn es keine weiteren yield Werte übrig ist. Diese Ausnahme wird normalerweise automatisch innerhalb einer for Schleife verbraucht. In meinem Fall würde die Ausnahme platzen, bis ich einen try/except Anweisungsblock habe, um damit umzugehen. Unten ist der Code, den ich verwendet habe, um diese Ausnahme zu behandeln. Wenn dies nicht der beste Weg ist, lassen Sie es mich bitte wissen.

try: 
    gen = read_epoch_from_file("Test") 
    readdata_ascii = next(gen) 
    #do somthing 
    readdata_ascii = next(gen) 
    #do somthing 
    readdata_ascii = next(gen) 
    #do somthing 
    gen.send('Stop') 
except StopIteration: 
    pass 
finally: 
    del gen 
Verwandte Themen