Zugriff auf Parameter

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
Neo12345
User
Beiträge: 12
Registriert: Mittwoch 22. April 2020, 13:00

Hallo,

bin noch nicht ganz vertraut mit Python und hänge gerade an einem Problem. Ich möchte eine Datei einlesen in der folgende Zeile steht:

#define PLFTALTH_DAQ {0xFFFFFFFF,0xFF,0xFF,0xFF,0,0x400167AE,2}

ich würde gerne auf die Adresse "0x400167AE" zugreifen.
Zu erst die Zeile aufsplitten. Problem ist, das alles in den {} als ein Parameter interpretiert wird.
Mit zielpar = list(paramter[2]) wollte ich eine Liste erstellen, sodass ich auf jeden Wert zugreifen kann.
Allerdings greife ich nur auf die einzelnen Strings zu. Kann mir jemand erklären, was ich ändern muss, um auf die Werte zuzugreifen?

Code: Alles auswählen

import fileinput
from tkinter import *
from tkinter import filedialog

root = Tk()

file_path = filedialog.askopenfilename(filetypes = (("daqlist", "*.h"), ("All files", "*.*")))

for line in fileinput.FileInput(file_path, inplace=1):
    if "#define PLFTALTH_DAQ" in line:
       parameter = line.split()
       print(parameter[2])
       zielpar = list(parameter[2])
       print(zielpar[0])
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich würde da mit RegEx ran gehen und einfach den Text zwischen zwei geschweiften Klammern suchen und dann mit Split am Komma trennen.
Neo12345
User
Beiträge: 12
Registriert: Mittwoch 22. April 2020, 13:00

@Jankie Die Variable vorne PLFTALTH_DAQ ist statisch und verändert sich nicht.
Die Adresse kann sich schon mal verändern. Deswegen würde ich gerne auf die Stelle zugreifen. Bestenfalls eine Liste der Parameter erstellen, die in den geschweiften Klammer sind.
Aber irgendwie schaffe ich es nur auf den String zuzugreifen. Mit der Lösung von String [29:39] bin ich nicht zufrieden. Das muss doch einfacher gehen, aber leider komme ich hier gerade nicht weiter...
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Neo12345: Jankie hat doch schon geschrieben, dass man das einfach mit einem regulären Ausdruck machen kann. Bedeutet aber, dass die Zeile auch so aussehen muß, was ja ein sehr eingeschränktes Subset von C-Parser mit Macro-Preparser ist.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wie gegsagt, mit RexEx kannst du dir den gesamten Inhalt der zwischen den beiden geschweiften Klammern steht zurückgeben lassen. Das wäre in deinem Beispiel "0xFFFFFFFF,0xFF,0xFF,0xFF,0,0x400167AE,2" da dann am Komma Splitten und du hast folgende Liste ['0xFFFFFFFF', '0xFF', '0xFF', '0xFF', '0', '0x400167AE', '2']. Das Element an der Stelle 5 ist dein gewünschter Wert.
Neo12345
User
Beiträge: 12
Registriert: Mittwoch 22. April 2020, 13:00

Danke euch beiden!! :D So einfach ist das also. Stand echt auf dem Schlauch.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dann würde ich auch alles mit dem regulären Ausdruck direkt erledigen

Code: Alles auswählen

r'#define .*? {(.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(.*?)}'
Und wenn man möchte kann man den ersten Text nach dem define natürlich auch noch einfangen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@/me: vielleicht möchte man auch nicht auf eine Fixe Anzahl an Elementen festgelegt sein (naja, durch das .*? landen alle weiteren Elemente in der letzten Gruppe). Daher alles in geschweiften Klammern in eine Gruppe und in Python per split aufspalten.
Antworten