2017-05-08 4 views
0

Ich versuche eine Binärdatei (float32) zu lesen, die eine Variable enthält, deren Format Little Endian ist.Binär lesen mit Python, während ich Format und Dimension kenne

Diese Binärdatei sollte eine 3d-Variable mit Dimensionen (8, 480, 1440) ergeben. Es gibt angeblich keinen Header, wie er in einer anderen Datei angegeben ist.

Nachdem ich mich viel Mühe gegeben habe, die Binärdatei zu lesen und verschiedene Lösungen auszuprobieren, konnte ich endlich mein Skript ausführen. Aber die Ausgabe war nicht wie erwartet (falsche Verteilung der Punkte), was mich denken lässt, dass irgendwann etwas schief gelaufen ist, obwohl ich nicht weiß wo.

ist hier ein minimales Beispiel des Codes, die laufen, aber hat mir nicht die erwarteten Ergebnisse:

filename=["CMORPH_3HLY_19980102"] 
with open(filename[0], mode='rb') as file: 
     fileContent = file.read() 

data=struct.unpack("f" * (len(fileContent) // 4), fileContent) 

nvar = 1          
ntim = 8 
nlat = 480 
mlon = 1440 
data_ok=np.array(data) 

cmorph=data_ok.reshape((mlon,nlat,nvar*ntim)).transpose() 

Ich denke, das Problem herkommt, was im Inneren des struct.unpack ist aber, da ich nicht sehr vertraut bin mit Binärformat und binären Dateien im Allgemeinen, weiß ich nicht, wie man das löst. Jede Hilfe und/oder Erklärung würde geschätzt werden!

+0

Was ist der Datentyp? 32-Bit-Ints? –

+0

Ich denke, es ist Gleitpunkte mit 32 Bytes. Dies wird in einem Matlab-Skript verwendet, das die gleichen Daten liest. Gibt es einen Weg, um sicher zu sein? Die Dokumentation besagt, dass jeder Datensatz ein reales * 4 Array von Daten enthält. – dcoppin

+0

Warum nicht 'np.fromfile (file [, dtype, count, sep])' \t Konstruieren Sie ein Array aus Daten in einer Text- oder Binärdatei. – stovfl

Antwort

0

Dank stovfl habe ich das gelöst. Hier ist der Code, der die np.fromfile und die reshape kombiniert.

cmorph = np.fromfile(file,type=np.float32,count=nvar*ntim*nlat*mlon)).reshape((nvar*ntim,nlat,mlon)) 
Verwandte Themen