INIs mit Kommentaren

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
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

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

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Wie kann man denn Kommentare einfügen? Reden wir vom selben Modul?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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. :(
Antworten