Ich arbeite gerade mit binären Daten in Dateien. Den Zugriff regele ich über Strings, in die ich vor dem Schreiben meine Werte mit »pack« aus dem Modul »struct« komprimiere bzw. aus denen ich sie mit »unpack« extrahiere.
Dabei stört mich stört ein klein wenig, dass »unpack« mir ein Tuple zurückliefert. Ich kann das Tuple natürlich problemlos auswerten, würde aber lieber mit Schlüsselwörtern anstelle der Indexnummer auf die einzelnen Werte zugreifen, z.B. so wie in einem Dictionary.
Gibt es dafür eine Möglichkeit?
Strukturdefinition für binäre Dateien
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Ganze Structures kannst du auch einfach mit Construct parsen und erstellen, da ist dann auch ein Zugriff per Name möglich.
Falls du die Struktur postest kann ich dir eine Starthilfe geben wie es etwa mit Construct aussieht.
Gruss
Ganze Structures kannst du auch einfach mit Construct parsen und erstellen, da ist dann auch ein Zugriff per Name möglich.
Falls du die Struktur postest kann ich dir eine Starthilfe geben wie es etwa mit Construct aussieht.
Gruss
Vielleicht ist ja das `construct`-Package etwas für Dich: http://construct.wikispaces.com/
Edit: Mist, zu spät.
Edit: Mist, zu spät.

Danke für den Hinweis. Ich werde mich mal damit beschäftigen.rayo hat geschrieben:Ganze Structures kannst du auch einfach mit Construct parsen und erstellen, da ist dann auch ein Zugriff per Name möglich.
Es geht um eine Datei mit Tags. Der prinzipielle Aufbau ist - auf das notwendige verkürzt - so:rayo hat geschrieben:Falls du die Struktur postest kann ich dir eine Starthilfe geben wie es etwa mit Construct aussieht.
Code: Alles auswählen
Pos Len Typ Beschreibung
--- --- --- -------------
x00 x04 4c "feste Dateikennung"
x04 x__ ___ Datenblock mit folgendem Aufbau
Off Len Typ Beschreibung
--- --- --- ------------
x00 x02 i "Blockkennung", aus der der Inhalt und die Art der
nachfolgenden Daten hervorgeht
1 = Bearbeiter, 2 = Datum, ... , 9 = Koordinaten, ...
x02 var var Daten, z.B. 2 Gleitzahlen "Rechtswert" und "Hochwert"
oder 1 String "Name" oder Zeitwert "Datum" oder ...
x__ --- -- nächster Datenblock
-
- User
- Beiträge: 773
- Registriert: Mittwoch 5. November 2003, 18:06
- Wohnort: Schweiz
- Kontaktdaten:
Hi
Hier mal ein kleines Beispiel:
Am besten schaust du mal das Tutorial an:
http://construct.wikispaces.com/tutorial
Gruss
Hier mal ein kleines Beispiel:
Code: Alles auswählen
import construct as con
block1 = con.Struct("zahlen_block",
con.UNInt8("typ"),
con.Switch("values", lambda ctx: ctx['typ'],
{
0x00: con.StrictRepeater(2, con.NFloat32("")),
0x01: con.StrictRepeater(4, con.NFloat64("")),
}
)
)
block2 = con.Struct("zweiter_block",
con.UNInt8("spam")
)
data_block = con.Struct("blocks",
con.UNInt16("typ"), # UNInt16 = Unsigned Native endian Integer 16Bit
con.Switch("block", lambda ctx: ctx['typ'],
{
0x00: block1,
0x01: block2,
}
)
)
file_tag = con.Struct("",
con.Const(con.UNInt8("magic_byte"), 0x4C), #Const bedeutet fester Wert
con.OptionalGreedyRepeater(data_block) # Solange wiederholen bis es nicht mehr geht
)
container = file_tag.parse_stream(file_handle)
oder
container = file_tag.parse(data)
print container.blocks
http://construct.wikispaces.com/tutorial
Gruss