2016-03-31 13 views
-1

Ich muss eine Fortran-Binärdatei mit Python lesen, mit dem Namen merg_2015041312_4km-pixel.Z (von here), die komprimiert ist; Die Struktur der unkomprimierten Datei ist definiert here. Die Definition besagt, dassDatensätze aus einer Fortran-Binärdatei in Python lesen

Jede Datei enthält 2 Datensätze: die erste für die "auf die Stunde" Bilder (": 00") und die zweite für die "zur halben Stunde" Bilder (": 30") .

und

Jeder Datensatz ist ein 9896 x 3298 Fortran Array von IR Helligkeitstemperaturen, die durch Subtrahieren von "75" skaliert wurden von jedem Datum in 1-Byte passen.

GrADS .ctl Dateibeschreibung:

DSET merg_1999042012_4km-pixel 
    OPTIONS yrev little_endian template 
    UNDEF 330 
    TITLE globally merged IR data 
    XDEF 9896 LINEAR 0.0182 0.036378335 
    YDEF 3298 LINEAR -59.982 0.036383683 
    ZDEF 01 LEVELS 1 
    TDEF 99999 LINEAR 12z04Apr1999 30mn 
    VARS 1 
    ch4 1 -1,40,1,-1 IR BT (add '75' to this value) 
    ENDVARS 

und ich versuchte, einige Python-Code zu schreiben:

>>> import struct 
>>> file = open("merg_2015041312_4km-pixel", 'rb') 
>>> data = struct.unpack('>h', file.read()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
struct.error: unpack requires a string argument of length 2 

Leider bin ich auf binäre Dateien nicht verwendet ...

Wie kann ich den zweiten Datensatz (halbstündlich) von dieser Datei erhalten?

+0

Ja, ich weiß. Ich habe mich gefragt, ob es einen Weg gibt, seine innere Struktur zu finden ... vielleicht werde ich nach einem "hexischen" GUI-Editor suchen und versuchen, es so zu lesen. Vielen Dank. – urgeo

+0

Ich fand das, konnte es helfen?'DSET merg_1999042012_4km-Pixel \t \t \t OPTIONS yrev little_endian Vorlage \t \t \t UNDEF 330 \t \t \t TITEL IR-Daten \t \t \t xDef 9896 LINEAR 0,0182 0,036378335 \t \t \t YDEF 3298 LINEAR 0,036383683 \t \t -59,982 global zusammen \t ZDEF 01 LEVELS 1 \t \t \t TDEF 99999 LINEAR 12z04Apr1999 30mn \t \t \t VARS 1 \t \t \t ch4 1 -1,40,1, -1 IR BT (Add '75' auf diesen Wert) \t \t \t ENDVARS ' – urgeo

+0

Lassen Sie uns [fortsetzen diese Diskussion im Chat] (http://chat.stackoverflow.com/rooms/107822/discussion-between-ilja-and-urgeo). –

Antwort

4

Von den dataset description Lesen und Testen mit einem dataset es klar ist, dass die Datei eine ist (komprimiert) Fortran Direktzugriffsdatei mit 2 Datensätze von IR-Daten mit einer Größe (9896, 3298) verkleinerter in 1 Byte passen um 75 von den Werten subtrahiert . Es ist nicht klar, ob das resultierende Byte vorzeichenlos oder signiert ist, weil ich keine Erfahrung mit GrADS Steuerungsdefinitionen habe.

numpy.fromfile ist ein Werkzeug für easily reading binary Fortran direct-access files.

Verwenden Sie entweder int8 oder uint8 als dtype Ihren Eintrag data type object zu bauen, prüfen, welche ein Sinn macht. Für Beispiel, wenn die Daten IR-Temperaturen in Kelvin sind, mit uint8 würde Ergebnis in Min 186 und Max 330 nach der Skalierung (~ -87 ° C bis 56,8 ° C). Upcast zu groß genug Typ für Upscaling, verwendet float hier könnte sein int16, int32 usw.

H = 9896 
W = 3298 
Record = np.dtype(('uint8', H*W)) 
A = np.fromfile('merg_2015041312_4km-pixel', 
       dtype=Record, count=2).astype('float') + 75 

Das resultierende 1D-Arrays neu geformt werden Abmessungen und Form zu korrigieren. Datentypobjekte würden Sub-Arrays unterstützen, aber sie sind always read in C-contiguous memory layout.

I_on_the_hour = A[0].reshape((H, W), order='F') # Fortran data order 
I_on_the_half_hour = A[1].reshape((H, W), order='F') 

Überprüfen Sie, ob die Ergebnisse vernünftig aussehen (in ipython --pylab)

plt.imshow(I_on_the_half_hour) 
+0

@urgeo Es scheint, dass Ihre Bearbeitungen abgelehnt wurden, während ich weg war. Sie haben Recht, dass die Bilder transponiert werden müssen. –