ConfigParser Frage

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
Gosu
User
Beiträge: 1
Registriert: Montag 31. Dezember 2012, 12:29

Hey Leute,

ich habe ein kleines Problem mit der Klasse ConfigParser:
Nach einer Änderung an meiner CONFIG.INI schreibe ich die Änderungen in die Datei per:

Code: Alles auswählen

	cfg = ConfigParser.ConfigParser()
	cfgfile = open("CONFIG.INI", "w")
	cfg.add_section("main")
	cfg.set("main", "main_menu", main_menu_conf)
	cfg.set("main", "game_menu", game_menu_conf)
	cfg.set("main", "default_bg", default_bg_conf)
        ...
        ...
        ...
	cfg.write(cfgfile)
	cfgfile.close()
Das funktioniert super, doch habe ich ein kleines Problem:
Wenn ich das richtig verstanden habe schreibt ConfigParser die Datei immer neu.
Dabei werden alle Kommentare in der Datei getilgt.
Kann ich das irgendwie ändern? Also die Datei bearbeiten anstatt sie neu zu schreiben?

Danke im Voraus!

EDIT: Wenn ich "w" zu "r+" ändere, ändert das garnichts.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

In den Beispielen zum RawConfigParser wird unter anderem die Option 'allow_no_value' verwendet.
Hilft Dir das weiter? Ich kann das leider gerade hier nicht probieren, da diese Option erst ab Python 2.7 eingeführt wurde. Ich habe hier bei mir aber nur 2.6 und 3.1 installiert. Komischerweise scheint die Option in 2.7 und dann wieder ab 3.2 enthalten zu sein... :K

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@mutetella: das ist nicht komisch sondern logisch. Die 2.x und 3.x-Zweige von Python werden schon seit
Jahren parallel weiterentwickelt und manche Neuerungen gehen dann in die neuste 2.x und neuste 3.x
Version ein.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius3
Oh, dann bin ich hier auf meiner Kiste mit 2.6 und 3.1 ja doppelt veraltet... :mrgreen:

@Gosu
Ich hab's jetzt derweil in einer pythonanywhere console mit 2.7 probiert:

Code: Alles auswählen

>>> conf = ConfigParser.ConfigParser(allow_no_value=True)     
>>> conf.add_section('example')
>>> conf.set('example', '#this is a comment')                 
>>> conf.set('example', 'valueless entry as comment')                  
>>> with open('test.cfg', 'wb') as configfile:                
...     conf.write(configfile)                                
...

Code: Alles auswählen

$ cat test.cfg
[example]
#this is a comment
valueless entry as comment

Code: Alles auswählen

>>> conf = ConfigParser.ConfigParser()                        
>>> conf.read('test.cfg')                                     
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/ConfigParser.py", line 305, in read
    self._read(fp, filename)
  File "/usr/local/lib/python2.7/ConfigParser.py", line 546, in _read
    raise e
ConfigParser.ParsingError: File contains parsing errors: test.cfg
        [line  3]: 'valueless entry as comment\n'                      
>>> conf = ConfigParser.ConfigParser(allow_no_value=True)
>>> conf.read('test.cfg')
['test.cfg']
>>> conf.set('example', 'whatever', 'you want')
>>> with open('test.cfg', 'wb') as configfile:
...     conf.write(configfile)
...

Code: Alles auswählen

$ cat test.cfg
[example]
valueless entry as comment
whatever = you want
Wie Du siehst ignoriert 'ConfigParser' beim Einlesen alle Zeilen, die mit Doppelkreuz oder Strichpunkt beginnen. Die einfachste Möglichkeit, Kommentarzeilen mit 'ConfigParser' zu handeln ist also die über "wertlose" Einträge wie "valueless entry as comment" in meinem Beispiel.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten