6 binäre dateien auslesen und als int in tabelle 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
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hallöchen, :-)

ich will(muss) 6 binäre Dateien auslesen um den Inhalt mit
gnuplot darstellen zu können.

3 der binären Dateien speichern nur 00000001 und 00000000 ab.
Also in jedem byte wäre nur eine 1 oder 0.

Die anderen 3 binären Dateien enthalten 32bit float Zahlen.

All diese Werte müssen in eine Tabelle geschrieben werden, die ich mit
gnuplot darstellen kann.

Ein Problem wäre das die Dateien in gewissen zeitlichen Abständen
beschrieben werden. Und wachsen und wachsen und wachsen. :-)

Die ausgelesenen Werte sollte in den 6 Dateien gelöscht werden,
damit ich die Dateien möglichst klein halten kann.

Ich würde mich freuen, wenn mir da Jemand ein paar gute Tipps, code schnippsel ... geben könnte.

Die binären 32 bit float Zahlen werden von rechts nach links ausgelsen.
00 00 A0 41(in Hex) wäre also 41 A0 00 00 und wäre +20.

Grüße Markus
BlackJack

@feldmann_markus: Schau Dir mal das `array`-Modul an.

Das mit dem wachsen der Dateien habe ich nicht so ganz verstanden!? Auf jeden Fall kann man nicht vom Anfang von Dateien etwas entfernen ohne die Datei neu zu schreiben. Man könnte innerhalb der Datei von weiter hinten nach weiter vorne kopieren, aber wenn einem das zwischendurch abraucht, dann hat man Datensalat.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

@BlackJack
Hört sich schon mal nett an mit Array.

Und zwar müsste ich meine binären Daten als float Werte in
einer neuen Datei speichern.

Kann man das array direkt konvertieren nach float ?
Mit <array.tofile(f)> werden die Werte wieder als binär
gespeichert, das bringt mir als Gnuplot-Tabellen Leser nichts.


Mein code sieht zur Zeit so aus:

Code: Alles auswählen

import array

f_daten = file('/home/markus/Documents/peakdaten.dat','w')

try:
    f_peaks_1 = file('/home/markus/Documents/peakdetektor1.hex','rb')
    print "Datei Objekt erstellt"
    array = array.array('c')
    print "Array Objekt erstellt"
    array.fromfile(f_peaks_1,4)
    print "Daten aus Datei an Array angehängt"
    array.tofile(f_daten)
    print "Array in Datei gespeichert"

except:
    print "Kann Datei nicht öffnen"

f_peaks_1.close()
f_daten.close()
Grüße Markus
BlackJack

@feldmann_markus: Ich hätte jetzt eigentlich gedacht, dass Du die Daten als Text speichern wolltest, also eben '20.0' für das Beispiel im ersten Beitrag!?

Was ist denn in 'peakdetektor1.hex'? Wenn es die 1-Byte-Werte sind, dann wäre 'b' der geeignetere Typcode und wenn es die binären 32-Bit-Floats sind, dann natürlich 'f'.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Ich hätte jetzt eigentlich gedacht, dass Du die Daten als Text speichern wolltest, also eben '20.0' für das Beispiel im ersten Beitrag!?
Ja mache ich auch noch. Ich hatte aber heute Feierabend gehabt und dann dden
Hammer fallen gelassen.
BlackJack hat geschrieben:Was ist denn in 'peakdetektor1.hex'? Wenn es die 1-Byte-Werte sind, dann wäre 'b' der geeignetere Typcode und wenn es die binären 32-Bit-Floats sind, dann natürlich 'f'.
Vielen Dank, ich habe auch schon was geändert:

Code: Alles auswählen

import array

f_daten = file('/home/markus/Documents/peakdaten.dat','w')

try:
    f_peaks_1 = file('/home/markus/Documents/peakdetektor1.hex','rb')
    f_peakvalue_1 = file('/home/markus/Documents/peakband1.hex','rb')
    print "Datei Objekt erstellt"
    array_peaks_1 = array.array('b')
    array_peakvalue_1 = array.array('f')
    print "Array Objekt erstellt"
    array_peaks_1.fromfile(f_peaks_1,4)
    array_peakvalue_1.fromfile(f_peakvalue_1,1)
    print "Daten aus Datei an Array angehängt"
    f_daten.write(str(array_peaks_1[0])+" "+str(array_peakvalue_1[0])+'\n')
    print "Array in Datei gespeichert"
except:
    print "Kann Datei nicht öffnen"

f_peaks_1.close()
f_daten.close()
In der 'peakdetektor1.hex' Datei stehen nur 8bit 1`en und 0`en, also
00000000 oder 00000001
und in der 'peakband1.hex' habe ich 32bit float Zahlen, wobei
die 32bit paarweise betrachtet werden müssen, da es sich um
real und imaginär 32bit float Zahlen handelt.

Ich bräuchte noch eine Schleife und das ganze am besten möglichst
performance optimiert. Außerdem wollte ich in die erste Spalte meiner
Gnuplot Tabelle einen Zeit Stempel eintragen.

Ich hatte Heute mal ein 'Hallo' an die Datei 'peakdetektor1.hex' angehängt und
es hat funktioniert. Das Programm das die 6 Dateien erstellt macht
nur alle 10 bis 20 sek ein sync. Schön wäre wenn ich die Dateien
periodisch verkleinern könnte.
Oder es werden alle Werte eingelesen und die 6 Dateien gelöscht und
wieder leer erstellt.

Und als Krönung wäre mir eine dynamische Anbindung ab Gnuplot lieb.
:-) Also das Gnuplot immer die neuesten 100 Datensätze darstellt.

Grüße Markus
Antworten