binäre Daten lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
aug_lager
User
Beiträge: 26
Registriert: Sonntag 4. Januar 2015, 12:01

Hallo liebes Forum,

ich habe ein sogenanntes Grid-File, das aus einem Programm namens Surfer stammt. Es handelt sich um eine Binärdatei und enthält im Wesentlichen Informationen mit Raumbezug (x,y,z-Koordinaten). Ich wäre nun gerne in der Lage, die Datei mit Python zu öffnen und die Daten zu bearbeiten. Es ist nicht nötig die Ergebnisse wieder in die Datei zu schreiben.

Folgendermaßen öffne ich die Datei und lese z.B. die erste Zeile ein:

Code: Alles auswählen

gridfile = open("test.grd", "rb")

# lese die erste Zeile
gridfile.read(1)
Nun habe ich noch nie mit binären Daten zu tun gehabt und überhaupt keinen Schimmer, wie ich die Binärdaten in solche umwandle, die ich auch lesen bzw. mit denen ich rechnen kann. Über google bin ich (vermutlich) auf die Dokumentation des Formats gestossen: http://geospatialdesigns.com/surfer7_format.htm

Leider versteh ich davon nichts. Wie kann ich zum Beispiel den Wert zMin auslesen? Gibt es dafür überhaupt eine einfache Möglichkeit?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@aug_lager: wenn Du noch nie mit Binärdaten gearbeitet hat und auch sonst niemand einen Leser für dieses Format für Python geschrieben hat, dann ist das nicht ganz einfach. Der Kommentar in Deinem Code ist falsch, weil es bei Binärdaten keine Zeilen gibt und Du nur das erste Byte gelesen und gleich wieder verworfen hast. Hilfreich dürfte `struct.unpack` nebst zugehöriger Dokumentation samt Beispielen sein. Für große Felder mit Floats ist `numpy.fromfile` ganz hilfreich.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Doku ist ja schon recht nett. Das Modul struct erlaubt dir, aus Bytes die entsprechenden Datentypen zu bauen. Sie schweigen sich zur endianess aus, das waere noch mal zu eruieren welche (big oder little) da verwandt wird.

Das prinzipielle Vorgehen ist einfach:

- lese 8 Bytes ein
- dekodiere sie mit struct.unpack in ID und Laenge der folgenden Daten.
- lese die entsprechende Menge an Daten ein.
- verzweige abhaengig von der ID in eine Unterfunktion, welche den Datensack weiter zerteilt.

Wenn du so weit bist, das du damit einmal durch die Datei gestiefelt bist, kann man sich mal daran machen, die einzelnen Sektionen zu sezieren.
aug_lager
User
Beiträge: 26
Registriert: Sonntag 4. Januar 2015, 12:01

Vielen Dank! Habs zwar noch nicht vollständig umgesetzt, aber das Prinzip verstanden. Bekomme mit struct die Daten so, wie ich sie gerne hätte.
Antworten