2017-09-26 1 views
1

Ich suche nach einer 2-Byte-Sequenz in einer Binärdatei, die zu groß ist, um in den Speicher zu passen. Ich kann nicht einfach 2 Bytes gleichzeitig lesen, weil z.B.Eine Binärdatei lesen: Hat Python eine entget() Entsprechung?

xx xx x1 2x xx 

Ebenso kann ich nicht einfach nach dem ersten und dann sehen, ob der zweite ist, weil

xx112xx 

Ich würde wirklich in der Lage sein mag, wie etwas zu tun:

with open("myfile", "rb") as f: 
    byte = f.read(1) 
    while byte: 
     if byte == b'1': 
      if f.read(1) == b'2': 
       # success case 
      else: 
       # put back the latest byte somehow 
     byte = f.read(1) 

Gibt es eine Funktion, um diese Lookahead-Arbeit ohne all die Buchhaltungsdetails zu machen, die ich für mich brauche?

Antwort

3

The io.BufferedReader() object hat ein peek() method:

Rückkehr aus dem Strombytes, ohne die Position vorrückenden. Es wird höchstens ein einziges Lesen des Rohdatenstroms durchgeführt, um den Anruf zu erfüllen. Die Anzahl der zurückgegebenen Bytes kann kleiner oder größer als angefordert sein.

Sie erhalten ein solches Objekt, wenn Sie eine Datei in Binär-Modus zum Lesen öffnen, so können Sie es direkt im Code verwendet:

with open("myfile", "rb") as f: 
    for byte in iter(lambda: f.read(1), b''): 
     if byte == b'1': 
      if f.peek(1) == b'2': 
       # success case 

berücksichtigen, dass das Byte wir noch spähte ist 'in the stream', der nächste f.read() Aufruf wird es enthalten. Sie müssen eine explizite f.read(1) ausstellen, wenn Sie das nicht wollen.

Ich ersetzte Ihre while Schleife mit einem iter() 2-argument call, um die Datei 1 Byte zu einer Zeit in einer for Schleife zu lesen.

Verwandte Themen