Seite 1 von 1

Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 12:27
von red_dust
Hi,

ich möchte mit ConfigParser Werte in einer INI Datei ändern lassen, das funktioniert soweit auch ganz gut, allerdings hätte ich gerne, dass die Kommentare in der INI Datei nicht gelöscht werden.


Beispielsweise sieht meine INI vor der Bearbeitung folgendermaßen aus:

Code: Alles auswählen

;#################
;# XXXX 7.2.0 #
;#################

;=============================================================================
[Configuration]
;=============================================================================
;Interface        = STD:ENET
;Interface        = REMOTE_ICOM_OBD
;Interface	= STD:OMITEC
Interface=REMOTE
;Interface	=ENET
Simulation       = 0

EcuPath          = C:\ECU
und danach:

Code: Alles auswählen

[Configuration]
interface = test
simulation = 0
ecupath = C:\ECU
mein Code:

Code: Alles auswählen

import ConfigParser
    cfg = ConfigParser.RawConfigParser()
    cfg.read("C:\MYCONFIG.INI")    
    print cfg.get("Configuration", "Interface")
    cfg.set("Configuration", "Interface", "test")
    output_file = open("C:\MYCONFIG.INI", 'w')
    cfg.write(output_file)
Gibt es da eine Möglichkeit?

Re: Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 13:17
von deets
Configobj verwenden. Auch aus vielen anderen Gruenden.

http://danielnoegel.de/wordpress/tag/configobj/

Re: Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 14:49
von red_dust
das Projekt habe ich auch schon gefunden klingt sehr vielversprechend, allerdings kann es die Datei nicht parsen :-(
configobj hat schon direkt mit der ersten Zeile ein Problem:

Code: Alles auswählen

;#################
ich habe mir den Code des Parsers mal angeschaut man muss den Code wie folgt ändern, dann funktioniert es:

Code: Alles auswählen

        while cur_index < maxline:
            if reset_comment:
                comment_list = []
            cur_index += 1
            line = infile[cur_index]
            sline = line.strip()
            # do we have anything on the line ?
            if not sline or sline.startswith('#') or sline.startswith(';'):
                reset_comment = False
                comment_list.append(line)
                continue
und zwar wurde der Zeile

Code: Alles auswählen

 if not sline or sline.startswith('#'):
das Semicolon hinzugefügt:

Code: Alles auswählen

 or sline.startswith(';')
warum das nicht schon vorher im Code war verstehe ich nicht aber so funktioniert es auf jeden Fall, ist halt etwas unschön dass man den Code erst bearbeiten muss...

Re: Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 14:55
von deets
Da hast du verschiedene Moeglichkeiten:

- einfach die Datei prae-prozessieren, und die fuehrenden ; durch # ersetzen bevor du sie configobj gibst. Speichern genauso. Ist aber natuerlich nicht sooo schoen

- monkey patchen, mag aber ein bisschen sehr haesslich sein, falls die Method groesser ist

- einen patch schreiben + dem Autor schicken, mit dem man entweder beide Conventionen beruecksichtigt, oder das Kommentar-Zeichen zumindest parametrisch macht.

Ich wuerde letzteres vorschlagen.

Re: Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 15:00
von EyDu
red_dust hat geschrieben:warum das nicht schon vorher im Code war verstehe ich nicht aber so funktioniert es auf jeden Fall, ist halt etwas unschön dass man den Code erst bearbeiten muss...
Das Modul kann ja nichts dazu, wenn du ein nicht unterstütztes Format verwendest ;-) Welches Format erwartet wird steht doch in der Dokumentation , sogar mit einem Abschnitt über Kommentare.

Das startswith lässt sich übrigens zusammenfassen:

Code: Alles auswählen

sline.startswith(("#", ";"))

Re: Konfigurationsdatei mit ConfigParser ändern

Verfasst: Dienstag 14. August 2012, 15:42
von ocoal
EyDu hat geschrieben:Das Modul kann ja nichts dazu, wenn du ein nicht unterstütztes Format verwendest ;-) Welches Format erwartet wird steht doch in der Dokumentation
Naja ... laut der Doku (http://www.voidspace.org.uk/python/conf ... nfig-files) ...
...The config files that ConfigObj will read and write are based on the 'INI' format. This means it will read and write files created for ConfigParser [4]...
basiert das Lesen/Schreiben auf dem INI-Format und ConfObj würde demnach das Format von Pythons ConfigParser unterstützten.

Das INI-Format: http://en.wikipedia.org/wiki/INI_file
sowie auch das unter [4] verwiesene RFC882: http://www.ietf.org/rfc/rfc0822.txt
als auch Pythons ConfigParser

geben alle ebenfalls das ";" Semikolon als Zeilenkommentar-Indikator an.

Quintessenz erscheint mir hier viel eher also, als dass ConfObj das vermeindlich "basierende" Format nicht vollständig implementiert hat.
Ich würde mich deswegen auch deets anschließen: den Patch den Autoren zu schicken.

-Colin-