Hallo ihr zusammen,
bitte entschuldigt meine frage, ich bin was programmieren angeht nicht sehr fitt, ich will es unbedingt lernen.
so es geht darum dass ich eine Hex-Datei lesen möchte und den inhalt in dezimal Zahlen konvertieren will.
so sieht der Inhalt aus:
0x0000000: EDF301C85A4EBCC726C9BF47ED6670C8
0x0000001: 686FEFC64CFF6F47983AA5466D6709C8
0x0000010: DAF2AAC768E7F8C6B42820C7985AAC46
so sieht der Inhalt aus, mein Ziel ist dieser inhalt in einem Array zu speichern, damir es so aussieht ["0: 237","1: 104","2: 70"]
Ich hoffe dass ihr mir helfen könnt.
Vielen Dank im Voraus
Liebe Grüße
Marie
Hexdezimalfile lesen und inhalt zu dezimal zahlen umwandeln
Deine gewuenschte Ausgabe macht so ueberhaupt keinen Sinn. Aber wie dem auch sei - die Funktionen, die du brauchst sind
sowie die diversen string-Methoden zum zerteilen eines Strings.
Am besten faengst du so an, dass du eine Zeile deiner Datei als Variable deklarierst, und dann erstmal eine Funktion baust, die das gewuenschte Ergebnis berechnet. Dann verbindest du das mit dem einlesen der Datei, und bist fertig.
Code: Alles auswählen
print int("ABCEDF", 16)
Am besten faengst du so an, dass du eine Zeile deiner Datei als Variable deklarierst, und dann erstmal eine Funktion baust, die das gewuenschte Ergebnis berechnet. Dann verbindest du das mit dem einlesen der Datei, und bist fertig.
Code: Alles auswählen
def tuwas(line):
...
zeile = "0x0000000: EDF301C85A4EBCC726C9BF47ED6670C8"
print tuwas(zeile)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hallo und herzlich Willkommen im Forum!
Schau Dir mal die Built-in Funktion `int` an. Da kannst Du als optionalen Parameter die Basis angeben. Eine Hexadezimalzahl entspricht folglich der Basis 16:
Nun musst Du eigentlich nur noch über die Quelldaten iterieren und die Umwandlung vornehmen.
Kurze Frage noch zur Datenstruktur: Bist Du Dir sicher, dass Du dieses Stringformat in einer Liste speichern möchtest? Denn einen Index kann man bei einer Liste immer leicht per `enumerate` generieren...
Schau Dir mal die Built-in Funktion `int` an. Da kannst Du als optionalen Parameter die Basis angeben. Eine Hexadezimalzahl entspricht folglich der Basis 16:
Code: Alles auswählen
In [21]: int("ED", 16)
Out[21]: 237
Kurze Frage noch zur Datenstruktur: Bist Du Dir sicher, dass Du dieses Stringformat in einer Liste speichern möchtest? Denn einen Index kann man bei einer Liste immer leicht per `enumerate` generieren...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Vielen Dank für die schnelle Antwort.
Das Problem ist dass ich die Datei mit dem befehl:
ReadFile = open(infile, 'rb') lese, aber ich kann den Inhalt nicht wie der in der Datei steht lesen:
auf der standardausgabe kommt so ein Text raus:
"È‚ È¹È tXÆ|}ÇGø”2GüõÓGøøXGÐÆ ÌÆ„›´Ç|¾šGLÂÆäÞÆÎ&ÈnȘ°È/¥½ÇÑ&ÀGØXoȼ íÆ¢ÊpGD‘¨F˜q È/¨©Ç¼®üÆ^]#ÇD׫F ZiE¼ð±ÆQŸ¥G¯•„
Ist es normal? die erste Frage ist nähmlich wie gebe ich diese Hex-Datei so aus wie sie tatsächlich aussiieht?
Danke noch mal
Marie
Das Problem ist dass ich die Datei mit dem befehl:
ReadFile = open(infile, 'rb') lese, aber ich kann den Inhalt nicht wie der in der Datei steht lesen:
auf der standardausgabe kommt so ein Text raus:
"È‚ È¹È tXÆ|}ÇGø”2GüõÓGøøXGÐÆ ÌÆ„›´Ç|¾šGLÂÆäÞÆÎ&ÈnȘ°È/¥½ÇÑ&ÀGØXoȼ íÆ¢ÊpGD‘¨F˜q È/¨©Ç¼®üÆ^]#ÇD׫F ZiE¼ð±ÆQŸ¥G¯•„
Ist es normal? die erste Frage ist nähmlich wie gebe ich diese Hex-Datei so aus wie sie tatsächlich aussiieht?
Danke noch mal
Marie
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wieso willst Du eine Textdatei binär öffnen?
Zudem solltest Du das `with open as`-Idiom nutzen:
Damit wird die Datei verlässlich automatisch geschlossen.
Zudem solltest Du das `with open as`-Idiom nutzen:
Code: Alles auswählen
with open(filename, "r") as infile:
# infile ist hier das offene File-Objekt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Hallo Hyperie,
ich habe mir ehrlich gesagt keine große Gedanken gemacht wie ich das am besten speichern soll(noch eine Anfängerin). Ich will aber der Inhalt in einer Reihe speicher, und durch den Index darauf zugreifen.
LG
ich habe mir ehrlich gesagt keine große Gedanken gemacht wie ich das am besten speichern soll(noch eine Anfängerin). Ich will aber der Inhalt in einer Reihe speicher, und durch den Index darauf zugreifen.
LG
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hyperion Hyperie klingt ja wie Hysterie
Also Du schlägst das vor:
Wie kommst Du denn jetzt an die "237", welche da er eigentliche Datenwert ist? Und was nützt Die die "0" in dem Datum? Du musst ja *vorher* den Index kennen, ansonsten kannst Du nicht drauf zugreifen. Außerdem stehen da jetzt lauter Strings in der Liste - Du willst ja aber wohl einen Integerwert haben...
Und Indizes generieren kann man nachträglich immer:
Da wir ja nicht wissen, was Du später mit den umgewandelten Werten machen willst, können wir hier nur allgemein zu einer einfachen Liste raten:
Also Du schlägst das vor:
Code: Alles auswählen
In [23]: result = ["0: 237","1: 104","2: 70"]
In [24]: result[0]
Out[24]: '0: 237'
Und Indizes generieren kann man nachträglich immer:
Code: Alles auswählen
In [26]: for index, value in enumerate(["Python", "Boa", "Natter"]):
....: print(index, value)
....:
0 Python
1 Boa
2 Natter
Code: Alles auswählen
In [27]: result = [237, 104, 70]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ja war nur ein Verzeiwefelungsmoment, weil ich auch mit "r" auch ganz komische zeichenketten gekriegt habe:
das kommt raus wenn ich das mit
with open(filename, "r") as infile:
File = infile.readline()
print(File)
Erste Zeile : "ÈÚòªÇhçøÆ´( ǘZ¬FÀÄiEhA³Æ&a¥GÚJ†Ç¦ùƒG´ý ÇZ¦·Ç´G,Ç&T‚G¦õëGL‹!GL*vGSå"
Ist das Normal? was soll noch geändert werden deiner Meinung nach?
Vieln Dank im voraus
das kommt raus wenn ich das mit
with open(filename, "r") as infile:
File = infile.readline()
print(File)
Erste Zeile : "ÈÚòªÇhçøÆ´( ǘZ¬FÀÄiEhA³Æ&a¥GÚJ†Ç¦ùƒG´ý ÇZ¦·Ç´G,Ç&T‚G¦õëGL‹!GL*vGSå"
Ist das Normal? was soll noch geändert werden deiner Meinung nach?
Vieln Dank im voraus
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ok, ich ahne was... Du hast gar keine Textdatei wie oben von Dir geschildert, sondern Du hast eine Datei mit binärem Inhalt! Das ist aber etwas ganz anderes als eine Datei mit hexadezimalen Zahlen!
Dann musst Du diese Datei natürlich im binären Modus öffnen. Dann kannst Du ja einfach mit den gängigen File-Objekt-Methoden auf die Bytes zugreifen.
Benutzt Du Python 2.x oder 3.x? Auch das könnte hier bedeutend werden.
Und zu guter letzt: Beschreibe doch mal bitte gloaber, was Du eigentlich erreichen willst! (Musikdaten bearbeiten, Bildverarbeitung, o.ä.) Ich habe das Gefühl, wie lösen hier ein XY-Problem und das sollten wir schnell abklären.
Dann musst Du diese Datei natürlich im binären Modus öffnen. Dann kannst Du ja einfach mit den gängigen File-Objekt-Methoden auf die Bytes zugreifen.
Benutzt Du Python 2.x oder 3.x? Auch das könnte hier bedeutend werden.
Und zu guter letzt: Beschreibe doch mal bitte gloaber, was Du eigentlich erreichen willst! (Musikdaten bearbeiten, Bildverarbeitung, o.ä.) Ich habe das Gefühl, wie lösen hier ein XY-Problem und das sollten wir schnell abklären.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ja Liste ist auch die beste Möglichkeit in diesem Fall, nur ich kann den Inhalt nicht lesen. Und oben war kein "o" sondern eine 0, ich habe mich vertippt.
aber meine Hauptfrage ist wie kann ich diese Datei so lesen wie ich den inhalt sehe. diese Datei kann ich nur mit einem Hex-taxteditor aufmachen.
aber meine Hauptfrage ist wie kann ich diese Datei so lesen wie ich den inhalt sehe. diese Datei kann ich nur mit einem Hex-taxteditor aufmachen.
@Marie: Deine Frage macht immer noch nicht viel Sinn. Wie siehst Du denn den Inhalt? Wenn man nichts weiter über die Daten weiss, dann sind das einfach Bytes. Wie genau möchtest Du Die denn interpretieren? Einfach als Zahlen zwischen 0 und 255? Dazu kannst Du die einzelnen Bytes mit der `ord()`-Funktion umwandeln.
Ja Hyperion, Du hast Recht, sorry aufgrund der fehleende Erfahrung kann ich mein Problem manchmal nicht gut beschreiben.
So das ist eine Datei mit binärem Inhalt, die Datei beinhaltet "eeg-werte". Die Werte müssen dann geplottet werden, aber das ist der nächste Schritt.
Ich benutze Python 2.7.2 für andere Fragen stehe ich zur Verfügung
So das ist eine Datei mit binärem Inhalt, die Datei beinhaltet "eeg-werte". Die Werte müssen dann geplottet werden, aber das ist der nächste Schritt.
Ich benutze Python 2.7.2 für andere Fragen stehe ich zur Verfügung
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Sind das Daten aus dem medizinischen "EEG"? Ein anderes EEG kenne ich nichtMarie hat geschrieben: So das ist eine Datei mit binärem Inhalt, die Datei beinhaltet "eeg-werte".
Bevor Du da ran gehst, wäre es sinnvoll das genau Format zu kennen! Gibt es da vom Gerätehersteller des EEGs nicht eine Spezifikation? Oder gibt es evtl. Tools vom Hersteller, diese Daten in irgend ein anderes Format zu konvertieren (welches sich dann ggf. leichter parsen lässt)? Oder ist das Format wirklich absolut trivial und beherbergt keine Metainformationen oder nur fixe in einer Art Header? Evtl. gibt es dafür auch schon ein Python-Modul, welches diese Arbeit erledigt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ja Hyperion, das ist der medizinische EEG. Die Datei hat die Endung ".eeg" und genau wie Dues beschrieben hast, es ist wirklich absolut trivial und fix in einer Art Header.
Ich bin verzweifelt, ich weiß nicht wie es weiter geht:(
Ich bin verzweifelt, ich weiß nicht wie es weiter geht:(
@Marie
Ohne mehr Details zu dem Format kann dir da keiner helfen. Die Dateiendung "eeg" ist nun alles andere als gelaeufig... du musst schon mit Dokumentation darueber herausruecken, wie die Datei aufgebaut ist. Das sollte der Hersteller irgendwie beibringen. Und danach vermute ich mal ist das Modul struct hilfreich, um die Binaerwerte in entsprechende Datentypen zu wandeln, welche dann matplotlib oder so verarbeiten kann.
Ohne mehr Details zu dem Format kann dir da keiner helfen. Die Dateiendung "eeg" ist nun alles andere als gelaeufig... du musst schon mit Dokumentation darueber herausruecken, wie die Datei aufgebaut ist. Das sollte der Hersteller irgendwie beibringen. Und danach vermute ich mal ist das Modul struct hilfreich, um die Binaerwerte in entsprechende Datentypen zu wandeln, welche dann matplotlib oder so verarbeiten kann.
@Marie: Mit dem Kenntnissstand geht es wahrscheinlich gar nicht weiter. Ich glaube nämlich kaum dass die Daten in den einzelnen Bytewerten und ohne jegliche Metainformation in der Datei stecken. Man müsste also das Format der Datei kennen oder erraten können.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wo ist denn jetzt das Problem? Du öffnest die Datei wie besprochen und liest die Werte in eine Liste ein:
Wenn Du weißt, wie groß der Header ist, kannst Du mit `file.seek` den Anfang überspringen, um bis zu den eigentlichen Daten "vorzuspulen".
Aber wie die anderen schon sagten ist das jetzt schon ziemlich spekulativ.
Code: Alles auswählen
with open(filename, "rb") as infile:
data = infile.read()
Aber wie die anderen schon sagten ist das jetzt schon ziemlich spekulativ.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ja ihr habt Recht.
ich habe vorhin etwas kleines erreicht:
die Ausgabe war dann:
ehrlich gesagt weiß ich nicht was die "unpack("<H", line[0:2])" macht und habe auch nicht verstanden was diese Zahl (63220, ) zu bedeuten?
vielleicht könnt ihr mir das erklären?
ich habe vorhin etwas kleines erreicht:
Code: Alles auswählen
infile = "blabla.eeg"
ReadFile = open(infile, 'rb')
print "Name of the file :", ReadFile.name
for line in infile:
line = ReadFile.read(32)
data= struct.unpack("<H", line[0:2])
print data
Code: Alles auswählen
Name of the file : blabla.eeg
(63220,)
ehrlich gesagt weiß ich nicht was die "unpack("<H", line[0:2])" macht und habe auch nicht verstanden was diese Zahl (63220, ) zu bedeuten?
vielleicht könnt ihr mir das erklären?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ok, das war die "Einsicht" - aber wo bleiben denn jetzt die angefragten Infos?Marie hat geschrieben:Ja ihr habt Recht.
Wieso benutzt Du nicht das von mir gezeigte Idiom zum Öffnen von der Datei? Es gibt gute Gründe für die Benutzung von `with` in diesem Kontext!
Wo hast Du das denn her? Das fällt ja nicht vom Himmel Ich würde Dir eben raten, Dir die Doku zum `struct`-Modul anzugucken.Marie hat geschrieben: ehrlich gesagt weiß ich nicht was die "unpack("<H", line[0:2])" macht und habe auch nicht verstanden was diese Zahl (63220, ) zu bedeuten?
Aber letztlich bringt das ja auch erst dann etwas, wenn Du mehr über das Format an sich weißt. Ggf. gibt es dann auch andere, bessere Module zum Parsen Deines Formates. Zu diesem Thema hatten wir unlängst einen Beitrag.
Aber zu diesem Format sind ja auch noch zig Fragen offen. s.o. und in vielen vorangegangenen Postings.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert