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.
INIs mit Kommentaren
- noisefloor
- User
- Beiträge: 3854
- 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
das configparser-Modul kann das doch... Mach' doch sonst mal ein Bespiel, was du genau vor hast.
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 13073
- 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
- noisefloor
- User
- Beiträge: 3854
- 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
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
- __blackjack__
- User
- Beiträge: 13073
- 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
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
so mit Python 3.6:
Ergebnis:
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
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)
...
>>>
Code: Alles auswählen
[main]
foo = bar
;some comment
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 13073
- 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
- noisefloor
- User
- Beiträge: 3854
- 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
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
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.
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.
- DeaD_EyE
- User
- Beiträge: 1017
- 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']))
Ich würde irgendein 3rd Party Modul verwenden, was das auch kann.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- __blackjack__
- User
- Beiträge: 13073
- 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
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.
Ich fürchte, da muss ich mir wohl etwas anderes überlegen.