452 Stimmen

Lesen einer Binärdatei und Schleifenbildung über jedes Byte

Wie lese ich in Python eine Binärdatei ein und führe eine Schleife über jedes Byte dieser Datei?

4voto

Tcll Punkte 6748

Wenn Sie etwas Schnelles suchen, hier ist eine Methode, die ich seit Jahren anwende und die sich bewährt hat:

from array import array

with open( path, 'rb' ) as file:
    data = array( 'B', file.read() ) # buffer the file

# evaluate it's data
for byte in data:
    v = byte # int value
    c = chr(byte)

wenn Sie Zeichen anstelle von Ints durchlaufen wollen, können Sie einfach data = file.read() was in py3 ein bytes()-Objekt sein sollte.

2voto

Allaye Punkte 795

Für große Größe Ich denke, mit einem Generator wird nicht schlecht sein, diese Antwort ist für das Lesen von etwas wie eine Datei, obwohl @codeapp hat eine ähnliche Antwort, die ich denke, das Entfernen der inneren Schleife wird mehr Sinn machen.

def read_chunk(file_object, chunk_size=125):
    while True:
        file =  file_object.read(chunk_size)
        if not file:
            break
        yield file

#sample use 
buffer = io.BytesIO()
file = open('myfile', 'r')
for chunk in read_chunk(file):
    buffer.write(chunk)
buffer.seek(0)
// save the file or do whatever you want here

Sie können sie immer noch als normale Liste verwenden, ich glaube nicht, dass dies von Nutzen ist, aber

file_list = list(read_chunk(file, chunk_size=10000))
for i in file_list:
    # do something

und auch den Index eines jeden Chunks erhalten

for index, chunk in enumurate(read_chunk(file, chunk_size=10000)):
    #use the index as a number index
    # you can try and get the size of each chunk with this 
    length = len(chunk)

wohlgemerkt, achten Sie auf die Größe der Datei, und die chunk_size ist immer in Bytes bei note.

0voto

Kurt Peters Punkte 121

Hier ist ein Beispiel für das Lesen von Netzwerk-Endian-Daten mit Numpy fromfile, das die obigen Kommentare von @Nirmal berücksichtigt:

dtheader= np.dtype([('Start Name','b', (4,)),
                ('Message Type', np.int32, (1,)),
                ('Instance', np.int32, (1,)),
                ('NumItems', np.int32, (1,)),
                ('Length', np.int32, (1,)),
                ('ComplexArray', np.int32, (1,))])
dtheader=dtheader.newbyteorder('>')

headerinfo = np.fromfile(iqfile, dtype=dtheader, count=1)

print(raw['Start Name'])

Ich hoffe, das hilft. Das Problem ist, dass fromfile nicht erkennt und EOF und erlauben gracefully brechen aus der Schleife für Dateien von beliebiger Größe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X