Binäre Datensätze getrennt in einzelner Datei speichern

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
Gondii
User
Beiträge: 24
Registriert: Freitag 11. September 2015, 05:56

Hallo Leute,

Ich möchte binäre Datensätze variabler Länge so in einer Datei abspeichern, dass ich sie beim späteren Auslesen wieder sauber voneinander trennen kann.
Hat Jemand ne Idee wie das gehen könnte? Wären es keine Binärdaten, würde ich einfach ein Trennzeichen einfügen und später an dem Trennzeichen splitten... aber wie macht man das binär?

Gruß, Gondii.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Ich würde mir dazu ein Trennzeichen aussuchen, z.B. ein für deinen Zweck passendes aus den ASCII-Zeichen 28-31. Eine Variante dessen wäre, dir einen Header, der ein paar Bytes lang ist auszudenken, um jeweils einen Datensatz einzuleiten. Je nach Art der Daten könnten vielleicht die genannten Steuerzeichen unabhängig auftreten; dies kann man so umgehen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dem Trennzeichen ist es vollkommen egal was du damit trennst, dass macht überhaupt keinen Unterschied. Alternativ dazu könntest du natürlich die Länge ebenfalls speichern, so dass du weisst wie weit du lesen musst.
BlackJack

Man könnte auch etwas vorhandenes nehmen wie messagepack. Bevor man anfängt sich eigene Formate auszudenken. :-)
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gondii: wie immer kommt es auf die Anwendung drauf an. Es gibt viele Möglichkeiten Binärdaten zu speichern. Das einfachste wäre wohl, die Länge vorweg zu Speichern: struct.pack('>I', len(data))
Alternativ kann man auch ein vorhandenes Format nehmen, das einem auch wahlfreien Zugriff beim Lesen erlaubt und bei dem man den einzelnen Datensätzen Namen geben kann:

Code: Alles auswählen

import zipfile.ZipFile as Container

container = Container('output.dat', 'w')
container.writestr('irgendwas', irgendwas_data)
container.writestr('sonnenschirmchen', sonnenschirmchen_data)
container.close()

[...]

container = Container('output.dat')
irgendwas_data = container.read('irgendwas')
container.close()
BlackJack

Ergänzende Anmerkung zu `zipfile`: Wenn man beim erstellen das enstprechende Argument angibt, dann werden die Daten sogar komprimiert.

Andere Alternative für eine Containerdatei in der Standardbibliothek mit Schlüsselzugriff wäre eine SQLite-Datenbank.

Wenn man ein Längenpräfix einsetzt, wäre es vielleicht eine Überlegung Wert IFF oder RIFF als Dateiformat zu verwenden.

Wenn es sich bei den Binärdaten um so etwas wie ein oder mehrdimensionale Arrays handelt, käme vielleicht auch HDF5 in Frage.
Antworten