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:
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
das Semicolon hinzugefügt:
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:
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-