Konfigurationsdatei mit ConfigParser ändern

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
red_dust
User
Beiträge: 16
Registriert: Montag 9. Juli 2012, 10:56

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?
red_dust
User
Beiträge: 16
Registriert: Montag 9. Juli 2012, 10:56

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...
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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(("#", ";"))
Das Leben ist wie ein Tennisball.
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

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-
Antworten