Ich habe eine Binärdatei, die 4-Byte-Binärwerte enthält, die jeweils einen Satz von zwei short int
darstellen. Ich weiß, dass ich einen einzigen 4-Byte-Binärwert in zwei kurze ganzen Zahlen wie folgt auspacken:Wie entpacke ich einen Binärdateipuffer in zwei Variablen?
from struct import unpack
fval = b'\xba\x1e\x99\x01' #actualy read from some file
qualdip, azi = unpack('hh', fval)
print(type(qualdip), qualdip)
print(type(azi), azi)
>>> <class 'int'> 7866
>>> <class 'int'> 409
Nun, ich den gesamten Puffer entpacken möge. Im Moment mache ich:
qualdips = []
azis = []
with open(bfile, 'rb') as buf:
fval = buf.read(4)
while fval:
qualdip, azi = unpack('hh', fval)
azis.append(azi)
qualdips.append(qualdip)
fval = buf.read(4)
, die eine Minute für eine 277MB-Datei übernimmt und scheint einen großen Speicher-Overhead zu erzeugen.
Ich möchte den gesamten Filebuffer direkt in die beiden Variablen entpacken. Wie erreiche ich das?
Ich vermute, dass struct.unpack_from
ist mein Freund, aber ich bin mir nicht sicher, wie man das Format formulieren.
with open(bfile, 'rb') as buf:
qualdip, azi = unpack_from('hh', buf)
extrahiert nur zwei Werte, und (ich weiß, die Anzahl der Elemente meiner Datei)
with open(bfile, 'rb') as buf:
qualdip, azi = unpack_from('72457091h72457091h', buf)
erwartet diese lächerliche Menge an Ausgangsvariablen. Also:
Wie tun Ich entpacke den gesamten Dateipuffer direkt in die beiden Variablen?
Haben Sie Ihren Code profiliert, um zu sehen, wo der Aufwand ist? Wenn die E/A-Vorgänge am längsten dauern, können Sie versuchen, die Datei in größeren Blöcken zu lesen. – theorifice