Wie lese ich in Python eine Binärdatei ein und führe eine Schleife über jedes Byte dieser Datei?
Antworten
Zu viele Anzeigen?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.
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.
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.
- See previous answers
- Weitere Antworten anzeigen