Hexdezimalfile lesen und inhalt zu dezimal zahlen umwandeln

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Marie hat geschrieben:Ja Du hast schon wieder Recht, ich weiß nicht wo ich die gefragten Details über dei Datei holen soll.
Naja, da gäbs ja zig Anlaufpunkte. Die Daten stammen doch von irgend einem Gerät - für dieses sollte es wohl eine Dokumentation geben. In dieser sollte man auch etwas zum Datenformat finden. Zur Not kann man mal beim Hersteller direkt recherchieren; sei es erst mal über die Webpräsenz oder per Support.

Du scheinst doch auf Universitätsniveau zu arbeiten - da solltest Du in dieser Hinsicht doch kreativ genug sein für Recherchen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ich stelle mal die Behauptung auf, dass es sich bei der Quelldatei um eine "normale" Binärdatei handelt und nicht, wie vermutet, um eine Textdatei. :K

Gruß ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bwbg hat geschrieben:Ich stelle mal die Behauptung auf, dass es sich bei der Quelldatei um eine "normale" Binärdatei handelt und nicht, wie vermutet, um eine Textdatei. :K
Dann sind wir uns ja einig ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ich war doch eben etwas erschrocken, als ich sah, dass der Thread schon zwei Seiten lang ist. Ih schreibe einfach zu langsam oder ich werde langsam alt :mrgreen:
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
norbert
User
Beiträge: 3
Registriert: Samstag 26. November 2011, 08:04

Hallo Marie,

ohne wenigstens den Hersteller des EEG-Systems zu kennen, kannst Du mit den Daten recht wenig anfangen. Selbst wenn Du das binäre Format errätst fehlen dir ja immer noch wichtige Infos wie Kanalzahl und Bezeichnungen, Abtastrate, Struktur usw. Das Ganze hat erst mal wenig mit Python zu tun, aber ohne diese Daten brauchst Du gar nicht erst mit einer Auswertung anfangen.
Wenn Du zumindest den Hersteller herausbekommst, kann ich dir vielleicht weiterhelfen.

VG
Norbert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

@Nobert: Danke Dir für dein Angebot, so bald ich mehr Details erfahre teile ich die mit euch.

Allerdings ich habe doch was erreicht, nächmlich mit diesem Code kann ich im moment die Zeilen lesen und als integerzahlen ausgeben.

Code: Alles auswählen

out = str()
i = 0
MyArray = []

with open("MyTest.eeg", "rb") as fp:
        for char in fp.readline():
            out = hex(ord(char))[2:]
            MyArray.append(out)
            print  ("Line Number :" + len(MyArray) + ":"  + int(out, 16))
Der Fehler, der gezeigt wird ist:
"TypeError: cannot concatenate 'str' and 'int' objects", es liegt an die print-funktion, weil wenn ich

Code: Alles auswählen

print len(MyArray)
print (int(out, 16)))
wird alles normal ausgegeben, wisst ihr wie ich den Fehler beheben kann:(

Danke im Voraus
Liebe Grüße
Marie
BlackJack

@Marie: Es liegt nicht an ``print``, sondern wie Die Fehlermeldung Dir mitteilt, dass man Objekte vom `str` und `int` nicht einfach mit ``+`` konkatenieren kann. Dazu müssen beide vom Typ `str` sein. (Oder etwas genauer: beide Untertypen von `basestring`.)

Code: Alles auswählen

In [105]: 'spam' + 42
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

TypeError: cannot concatenate 'str' and 'int' objects
Objekte haben einen Typ und der legt fest was man mit einem Objekt machen kann. Falls Du das noch nicht getan hast, arbeite mal das Tutorial in der Python-Dokumentation durch, um Dich mit den Grundtypen und -funktionen von Python vertraut zu machen. Statt ``+`` zum Aufbauen von Zeichenketten solltest Du Dir auch besser Zeichenkettenformatierung mittels ``%``-Operator oder `format()`-Methode auf Zeichenketten angewöhnen. Damit würde ich auch eine Umwandlung von Zahlen in eine Hexadezimaldarstellung machen wenn man den '0x'-Präfix nicht haben möchte.

Es handelt sich um eine Binärdatei, da gibt es keine Zeilen, also macht `readline()` keinen Sinn. Das liest die Datei bis zum ersten Auftreten der Bytewerte die auf dem System auf dem das ausgeführt wird, in *Textdateien* ein Zeilenende markieren würden. Zum einen kann das also unterschiedliche Ergebnisse für die selbe Datei auf unterschiedlichen Systemen ergeben und zum anderen haben die Bytewerte in Binärformaten in aller Regel eine andere Bedeutung. Sie können dort zum Beispiel Bestandteil von binär kodierten Messwerten sein.

Man muss in Python keine Variablen deklarieren. Mal abgesehen davon, dass `i` gar nicht verwendet wird, sind die Zuweisungen am Anfang an `out` und `i` überflüssig.

`MyArray` wird nur verwendet um davon die Länge abzufragen — das hätte man auch mit einem Zähler machen können. Den muss man nicht einmal selber hochzählen, dafür gibt es die `enumerate()`-Funktion.

Innerhalb der Schleife werden unnötige Umwandlungen gemacht. Die hexadezimale Darstellung des Bytewertes wird nirgends tatsächlich verwendet.

'Line Number' ist semantisch falsch. Mal davon abgesehen dass es in Binärdateien, wie schon gesagt, keine Zeilen gibt, ist das hier der Byte-Versatz vom Anfang der Datei.

Falls Du Python 2.x einsetzt solltest Du die Klammern bei ``print`` weg lassen, denn dort ist das keine Funktion sondern eine Anweisung. Falls Du Python 3.x einsetzt sind die Klammern deshalb natürlich notwendig, dann solltest Du aber Leerzeichen zwischen dem Funktionsnamen und der öffnenden Klammer weg lassen, damit man das auch deutlich als Funktionsaufruf erkennen kann.

Wegen der Namensgebung und der Einrückung könntest Du mal einen Blick in PEP 8 -- Style Guide for Python Code werfen.

Der (nicht sinvolle) Quelltext könnte vereinfacht so aussehen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-


def main():
    with open('MyTest.eeg', 'rb') as eeg_file:
        for i, byte in enumerate(eeg_file.readline()):
            print 'Offset:%3d:%d' % (i, ord(byte))


if __name__ == '__main__':
    main()
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Danke Dir BlackJack für die ausführliche Erklärung und Korrektur. Vor ca. eine Woche habe ich angefangen mich mit PYthon zu beschäftigen, darüberhinaus bin ich nicht fitt bei programmieren. Ich will aber unbedingt lernen und mich verbessern.
Für Jegliche Tipps oder Empfehlungen wäre ich Dir/Euch dankbar.

LG
Marie
Antworten