cfg-Reader

Code-Stücke können hier veröffentlicht werden.
Antworten
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Montag 4. April 2005, 22:58

Obwohl es das Ganze schon gibt (http://python.sandtner.org/viewtopic.php?t=1785; Modul ConfigParser) musste ich mein neues Wissen doch gleich noch einmal ausprobieren.

Also habe ich etwas Programmiert, was mir den Inhalt einer "besonderen" .cfg Datei in einem Dictionary liefert.

Wie immer bin ich für Kritik herzlich dankbar.

Code: Alles auswählen

from itertools import ifilter

def conf(lines):
    for line in iter(lines):
        yield line.split("=")

def get_line(line):
    line = line.rstrip("\n") # nimmt den \n aber nicht weg...
    return line and not line.startswith("#")

if __name__ == "__main__":
    TestData = ("#Dies ist eine Konfigurationsdatei"
        ,"ServerName=Timerfrei\n\n\n"
        ,"ServerPort=2030"
        ,"PlayerName=Hugu Hans")
    
    res = dict(conf(ifilter(get_line, TestData)))

    print """ServerName: %s
ServerPort: %s
PlayerName: %s""" % (res.get("ServerName", None)
                       , res.get('ServerPort', None)
                       , res.get('PlayerName', 'player1'))
Leider werden die vielen '\n' nicht entfernt?!
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
BlackJack

Montag 4. April 2005, 23:10

Zeichenketten können nicht verändert werden. Jede Operation gibt eine neue Zeichenkette zurück.

Und das `split()` solltest Du auf eine "Bruchstelle" beschränken, also ``split("=", 1)`` sonst gibt's Probleme wenn in einer Zeile mehr als ein '=' vorkommt.
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Dienstag 5. April 2005, 10:49

Code: Alles auswählen

def get_line(line):
    line = line.rstrip("\n") # nimmt den \n aber nicht weg...
    return line and not line.startswith("#") 
Durch die Benutzung im ifilter wird ja nicht der Inhalt der Zeile ausgewertet, sonder es kommt ja nur True oder False raus.
Dann muss das line.rstrip() in die conf Funktion.

Code: Alles auswählen

def conf(lines):
  for line in iter(lines):
    yield line.rstrip('\n').split("='",1)
Was ist eingenlich der große Unterschied zwischen filter und ifilter, map und imap, zip und izip?
Welchen Vorteil hat das Iteratorinterface außer das es speicherschonender ist?


Das mit dem split('=', 1) werde ich einbauen, danke.
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
BlackJack

Dienstag 5. April 2005, 21:19

Speicherschonender ist der hauptsächliche Vorteil. Es muss nicht jedesmal eine neue Liste angelegt werden, was sich vor allem beim verketten von den Funktionen positiv bemerkbar macht.

Und man kann Programme schreiben, die unter Umständen gigabyteweise Daten verarbeiten, z.B. Messwerte oder Logdateien, ohne viel Speicher zu verbrauchen weil sie nicht komplett in den Speicher geladen werden müssen.
Antworten