ConfigParser: mehrzeilige Einstellungen

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
wdsl
User
Beiträge: 35
Registriert: Donnerstag 22. Februar 2007, 16:26

Hi,
wie kann ich mit ConfigParser mehrzeilige Einstellungen vornehmen? Ich will einen kleinen Text in meiner Config speichern der kann allerdings auch aus mehr als einer Zeile bestehen.

Deshalb habe ich \n verwendet allerdings werden diese in meinem Script dann nicht so interpretiert sondern so ausgegeben wie kann ich das ändern?

vielen Dank
wdsl
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Öhm, mit dem Python Module ConfigParserkannst du Dateien, die im sogenannten Ini-Format geschrieben sind, parsen und auf den Inhalt zugreifen.

Falls deine Verwendung nicht auf der Unterstützung des Ini-Formates beruht, solltest du lieber die Finger vom ConfigParser lassen und dir eine eigene Logik überlegen und dann implementieren.

Falls doch ... hier ein wenig Beispielgeschnippsel ....

Z.B.

Code: Alles auswählen

[base]
name=My Application
version=1.0

[additional]
path=c:\MyApp
Hier ein Beispiel um den Zugriff mittels einer ConfigParser.ConfigParserInstanz zu veranschaulichen:

Code: Alles auswählen

>>> import ConfigParser
>>> 
>>> parser = ConfigParser.ConfigParser()
>>> parser.read(r'c:\work\Python\test.cfg')
>>> 
>>> print parser.sections()
['base', 'additional']
>>> 
>>> for section in parser.sections():
... 	print "Section:", section
... 	for option in parser.options(section):
... 		print "-> %s=%s" % (option, parser.get(section, option))
... 		
Section: base
-> version=1.0
-> name=My Application
Section: additional
-> path=c:\MyApp
>>>
>>> parser.add_section('added manually')
>>> parser.set('added manually', 'test', '1,2,3,4,5 ...')
>>> 
>>> open_file = open(r'c:\work\Python\test.cfg', 'w')
>>> parser.write(open_file)
>>> open_file.close()
>>> 
Nach dem Hinzufügen der Sektion "added manually" und dem dortigen Setzen eines neuen Wertes "test" sowie Speichern des aktuellen Standes in die zuvor erneut geöffnete Config-Datei, sah diese wie folgt aus:

Code: Alles auswählen

[base]
version = 1.0
name = My Application

[additional]
path = c:\MyApp

[added manually]
test = 1,2,3,4,5 ...
BlackJack

`ConfigParser` kann mehrzeilige Werte parsen. Man muss die Folgezeilen nur mindestens ein Leerzeichen einrücken und die Einrückung wird beim Parsen entfernt:

Code: Alles auswählen

In [20]: a = ConfigParser.ConfigParser()

In [21]: source = """
   ....: [test]
   ....: multi = abcdef
   ....:   ghijkl
   ....: """

In [22]: a.readfp(StringIO(source))

In [23]: a.get('test', 'multi')
Out[23]: 'abcdef\nghijkl'

In [24]: print a.get('test', 'multi')
abcdef
ghijkl
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Es funktioniert wie BlackJack beschrieben hat.
BlackJack hat geschrieben:... Man muss die Folgezeilen nur mindestens ein Leerzeichen einrücken und die Einrückung wird beim Parsen entfernt
Hierbei wird jedoch mehr als nur die Einrückung entfernt (herraus geparst) ... nämlich im Falle einer Leerzeile (Zeile mit Steuerungszeichen, Spaces, etc.) ebenso diese ;).
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Masaru hat geschrieben: Falls deine Verwendung nicht auf der Unterstützung des Ini-Formates beruht, solltest du lieber die Finger vom ConfigParser lassen und dir eine eigene Logik überlegen und dann implementieren.
Wie meinst du das mit Unterstützung des Ini Formates?
Das ist doch nen ganz normale Textdatei die sowol Windows als auch Linux lesen kann und Python erstrecht?
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Bei Initialisierungsdateien (schau Dir mal hier den Link an: http://de.wikipedia.org/wiki/Initialisierungsdatei) handelt es sich in der Regel um quasi Textdateien .. also um Dateien, deren Inhalt in Klartext geschrieben, und von einem Anwender mit einem Texteditor verständlich gelesen und geändert werden kann.

Ini-/Config-Dateien dienen z.B. als Vor-Konfigurationsschnittstelle für Anwendungen. D.h. aber auch, dass eine Anwendung diese Datei einlesen, zerlegen und verarbeiten können (gemeinhin als "parsen" bezeichnet) muss.

Eine Datei einzulesen sollte unter Linux wie Windows kein Problem sein. Die Programmiersprache Python ist noch ein ganz anderer Schuh. Für Python gibt es Interpreter auf beiden Betriebssystemen, in denen die Funktionalität angeboten wird "Dateien zu öffnen/einzulesen".

Eine einlesbare, in Klartext geschriebene Datei ist aber noch lange keine Ini-/Config-Datei, wie sie mittels des ConfigParser Moduls verarbeitet werden kann.

Es gibt also eine vorgebene Struktur, wie solche Dateien inhaltlich aufgebaut sein sollen (ist oben im Link erklärt).

Sieht immer so aus:

Code: Alles auswählen

[section]
key=value
Erst wenn eine Datei:
- Inhaltlich nach dem Ini-Format
- Klartext (nicht codiert o.ä. verschlüsselt)
aufgebaut ist, ist es auch eine gültige Ini-/Cofig-Datei.
Antworten