Seite 1 von 1

INIs mit Kommentaren

Verfasst: Montag 11. Juni 2018, 17:52
von nezzcarth
Hallo :)

ich suche eine Möglichkeit, in Python INI-Dateien zu verarbeiten, die Semikolons als Kommentarzeichen erlaubt und die Kommentare beim Schreiben erhält. configparser und configobj (5.0.6; die Doku kündigt frei definierbare Kommentarmarker für eine bisher nicht verfügbare Version 5.1 an) fallen beide raus. Hat vielleicht jemand einen Tipp für mich?

Danke schon mal.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 06:43
von noisefloor
Hallo,

das configparser-Modul kann das doch... Mach' doch sonst mal ein Bespiel, was du genau vor hast.

Gruß, noisefloor

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 08:49
von __blackjack__
@noisefloor: Das `configparser`-Modul erhält die Kommentare beim schreiben? Davon steht nichts in der Dokumentation und in Python 2.7 macht es das nicht.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 09:25
von noisefloor
Hallo,

nee, macht's nicht. Nur, wenn man neue Kommentare einfügt. Die werden mit geschrieben (getestet mit Python 3.6.).
So hatte ich auch die Eingangsfrage verstanden.

Gruß, noisefloor

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 10:00
von __blackjack__
@noisefloor: Wie kann man denn Kommentare einfügen? Reden wir vom selben Modul?

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 10:14
von noisefloor
Hallo,

so mit Python 3.6:

Code: Alles auswählen

>>> import configparser
>>> data = '''[main]
... foo = bar'''
>>> config = configparser.ConfigParser(allow_no_value=True)
>>> config.read_string(data)
>>> config.set('main', ';some comment', None)
>>> with open('testconfig.ini', 'w') as f:
...     config.write(f)
...
>>>
Ergebnis:

Code: Alles auswählen

[main]
foo = bar
;some comment
Das sollte auch bei älteren Python-Version funktionieren, wobei die Kommentarzeile wohl dann auch so: `;some comment = `aussehen könnte. Habe aber gerade kein Python 3.5 oder 2.7 zum Testen greifbar.

Gruß, noisefloor

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 10:19
von __blackjack__
Naja, das ist aber ein Hack. Du missbrauchst da das INI-Dateien keine Möglichkeit kennen Inline-Kommentare irgendwie zu escapen und missbrauchst einen Schlüsselnamen als Kommentar. Eine `configparser`-Implementierung könnte an der Stelle auch eine Ausnahme auslösen das der Schlüssel ein Kommentarzeichen enthält.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 11:08
von noisefloor
Hallo,

so gesehen: ja. Der "Hack" ist auch so bei SO zu finden. Korrekt ist, dass das configparser-Modul keine Methode kennt, um Kommentar gezielt als Kommentar und nicht wie ein Schlüssel ohne Wert hinzuzufügen.

Gruß, noisefloor

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 12:08
von nezzcarth
Danke euch beiden für die Antworten und entschuldigt bitte, wenn es etwas missverständlich formuliert war.

Ich meinte es so, wie __blackjack__ schrieb: Ich möchte mit Python Werte in einer Ini-Datei, die Semikolons als Kommentarmarker verwendet, ändern. Wenn ich das mit dem configparser Modul unter Python 3 mache, sind nach dem Zurückschreiben in die Datei alle Kommentare weg. Ich vermute, configparser ignoriert die Kommentare schon beim Parsen.

Das 3rd Party-Modul configobj kann zwar wohl Kommentare erhalten, aber zumindest im Moment nur mit Kommentaren umgehen, die mit einem # markiert sind. Ich könnte zwar versuchen, die Semikolons durch Doppelkreuze zu ersetzen, aber eine sauberere Methode (oder eine andere Library, die das kann) wäre mir lieber.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 13:27
von DeaD_EyE

Code: Alles auswählen

import configparser
import io

cfg = configparser.ConfigParser(allow_no_value=True)
cfg.add_section('Server')
cfg.set('Server', '# Hier beginnt die Serversektion')
cfg.set('Server', 'ip', '127.0.0.1')
cfg.set('Server', 'port', '88')
print('Vor dem Speichern:', dict(cfg['Server']))
buffer = io.StringIO()
cfg.write(buffer)
buffer.seek(0)
cfg = configparser.ConfigParser(allow_no_value=True)
cfg.read_string(buffer.read())
print('Nach dem Einlesen:', dict(cfg['Server']))
Bei mir verschwinden die Kommentare leider wieder nach dem Einlesen. D.h. sobald man eine Config einliest und dann wieder speichert, gehen alle Kommentare verloren.
Ich würde irgendein 3rd Party Modul verwenden, was das auch kann.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 13:37
von __blackjack__
nezzcarth: Du könntest auch mal bei `configobj` schauen wie böse hart kodiert das Zeichen dort ist, und ob man das eventuell „monkey patchen“ kann.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 14:24
von Sirius3
configobj ist ganz böse, es gibt zwar ConfigObj.COMMENT_MARKERS aber im Code sind auch noch hart codiert Stellen, wo auf '#' geprüft wird.

Re: INIs mit Kommentaren

Verfasst: Dienstag 12. Juni 2018, 18:46
von nezzcarth
Die Doku von configobj erwähnt zwar, wie man den Kommentarmarker mit "COMMENT_MARKER" anpassen kann. Soweit ich es sehe, bezieht sich die Default Doku aber auf eine Version, die es gar nicht gibt (bei Github sieht es auch eher nach einem unfertigen Rewrite aus). Bei PyPi und überall sonst findet man eine Version 5.0.6. Wenn ich durch deren Code greppe, finde ich 'COMMENT_MARKER' auch nicht, sondern nur, wie Sirius 3 meinte, viele Stelle, wo # hart gecodet ist. Wenn man die Doku bei readthedocs auf die vorherige Version umschaltet, ist der Verweis darauf auch nicht mehr vorhanden.

Ich fürchte, da muss ich mir wohl etwas anderes überlegen. :(