Ich habe schon des öfteren Parser für Dateien geschrieben, deren Ebenen aber begrenzt waren (Beispiel: INI -> begrenzt, XML -> unbegrenzt).
Nun wollte ich für mein neues Projekt auch einen Parser schreiben, der unbegrenzt viele Ebenen unterstützt, das ganze ist jedoch schwieriger als zuvor vermutet.
Diesen Code hier habe ich bereits fabriziert:
Code: Alles auswählen
self.data = {}
#...
def isNextLineSectionStart(index):
if len(lines) > index + 1:
return lines[index + 1].startswith("{")
return False
fileobj = open(path, "r")
lines = [line.strip().rstrip().split("//")[0] for line in filter(lambda line: len(line.strip().rstrip()) and not line.strip().startswith("//"), fileobj)]
fileobj.close()
current = self.data
previous = [self.data]
for index, line in enumerate(lines):
if isNextLineSectionStart(index):
previous.append(current)
current = current[line] = {}
continue
if line.startswith("}"):
current = previous.pop()
continue
if line.count(" "):
char = line.find(" ")
value = line[char + 1:]
current[line[:char]] = (value[value.find("\"") + 1:value.rfind("\"")] if value.count("\"") else value)
self.data = current
Code: Alles auswählen
start
{
position1 "-1022.963745,793.409607,8.966581"
position2 "-1024.971558,70.542549,416.005066"
name "Start"
reset 1
time 0.0
active 1
give
{
item "flashlight"
weapon "rpg"
ammo
{
amount 20
type "rocket"
}
}
}
bla
{
# ...
}
Ich könnte es auch auf eine Ebene begrenzen, aber das ist
a) nicht der Sinn da ich die Konfiguration dann umschreiben müsste
b) doof weil ich es dann nie verstehen würde
Hoffentlich könnt ihr mir dazu Tipps geben und auch sagen, wieso das ganze so nicht funktioniert. Ich möchte es nämlich nicht nur fertig haben sondern auch verstehen

Danke im voraus an alle. Und bitte keine Ratschläge für irgendwelche XML-Parser oder so - damit habe ich bereits gearbeitet aber ich möchte es einfach mal selber probieren

Edit: Mir ist gerade noch eingefallen, dass ich auch "Probleme" beim erkennen bzw. splitten der Daten habe. Bisher kann man nur
Code: Alles auswählen
name "wert"
Gruß