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.
Binäre Datensätze getrennt in einzelner Datei speichern
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.
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.
Man könnte auch etwas vorhandenes nehmen wie messagepack. Bevor man anfängt sich eigene Formate auszudenken.
@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:
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()
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.
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.