Seite 1 von 1

ini-Datei mit ConfigParser verändern

Verfasst: Freitag 22. Juli 2005, 20:58
von x-herbert
n'Abend

ich habe ein kleines Tkinter-Programm, welches mit Standardwerten aus einer ini starten soll und die geänderten Werte beim Beenden des programms wieder in die ini schreiben soll.

Zum Testen habe ich das Snippet von effbot genommen und wie folgt erweitert:

Code: Alles auswählen

import ConfigParser
import sys
file = open("config.ini", 'w')
file2 = open("config.ini", 'r')
config = ConfigParser.ConfigParser()

# Anzeige
config.readfp(file2)
file2.close()
for o, v in config.items("book"):
    print o, v
  

# set a number of parameters
if not config.has_section("book"):
    config.add_section("book")


config.set("book", "author", "fredrik lundh")
config.set("book", "zauthor", "yyyyyyyyyy")
config.set("book", "yauthor", "7ffffffffff")
config.set("book", "title", "the python standard library")

if not config.has_section("ematter"):
    config.add_section("ematter")
config.set("ematter", "pages", 250)

# write to file
config.write(file)
file.flush()
file.close()
Eigentlich sollten hier die Werte Angezeigt "for o,v in ..." und dann in ggf. geänderter Form über set+write zurückgeschrieben werden.

Es erscheint aber immer die Fehlermeldung "NoSectionError: No section: 'book'".

Wenn ich den Bereich "# Anzeige" rausnehme wird eine vernünfitge Datei geschrieben - sonnst nur eine leere Datei.

Kann mir jeman helfen??! - vorab meinen Dank..

Gruss x-herbert

Re: ini-Datei mit ConfigParser verändern

Verfasst: Freitag 22. Juli 2005, 22:44
von BlackJack
Du musst die Dateioperationen in die richtige Reihenfolge bringen.
x-herbert hat geschrieben:

Code: Alles auswählen

import ConfigParser
import sys
file = open("config.ini", 'w')
file2 = open("config.ini", 'r')
config = ConfigParser.ConfigParser()

# Anzeige
config.readfp(file2)
file2.close()
for o, v in config.items("book"):
    print o, v
Beim ersten `open()` wird die Datei nicht nur zum Schreiben geöffnet, sondern auch der alte Inhalt gelöscht! Das zweite `open()` öffnet also eine leere Datei zum lesen. Da ist natürlich dann auch kein Abschnitt `[book]` enthalten.

Code: Alles auswählen

# write to file
config.write(file)
file.flush()
file.close()
Der Aufruf von `flush()` ist überflüssig, das wird bei einem `close()` automatisch gemacht.

Dateien sollte man im allgemeinen so kurz wie möglich offen halten. Also die Datei zum lesen öffnen, einlesen und dann gleich wieder schliessen. Und später dann zum schreiben öffnen, schreiben und ebenfalls gleich wieder schliessen. Dann brauchst Du auch nur einen Namen für das Dateiobjekt.

Verfasst: Samstag 23. Juli 2005, 09:16
von x-herbert
probiere ich aus...

Verfasst: Samstag 23. Juli 2005, 09:28
von x-herbert
super! funktioniert

Code: Alles auswählen

import ConfigParser

file = open("config.ini", 'r')
config = ConfigParser.ConfigParser()
config.readfp(file)
file.close()
for o, v in config.items("book"):
    print o, v
  
# set a number of parameters
if not config.has_section("book"):
    config.add_section("book")

config.set("book", "author", "1fredrik lundh")
config.set("book", "zauthor", "yyyyyyyyyy")
config.set("book", "yauthor", "6ffffffffff")
config.set("book", "title", "the python standard library")

if not config.has_section("ematter"):
    config.add_section("ematter")
config.set("ematter", "pages", 350)

# write to file
file = open("config.ini", 'w')
config.write(file)
file.close()
noch ne Frage: gibt es eine Erklärung, warum in der ini die Reihenfolge der Options so durcheinander gewürfelt ist? Mit obigem Code wird

Code: Alles auswählen

[book]
yauthor = 6ffffffffff
zauthor = yyyyyyyyyy
author = 1fredrik lundh
title = the python standard library

[ematter]
pages = 350
geschrieben... ??? warum bleibt die Reihenfolge von "set" nicht erhalten??

Verfasst: Samstag 23. Juli 2005, 13:45
von Joghurt
x-herbert hat geschrieben:warum bleibt die Reihenfolge von "set" nicht erhalten??
Weil die Werte bestimmt in einem Dictionary (= Hashmap) gespeichert werden. Und in einem dictionary bleibt die Reihenfolge der Schlüssel nicht unbedingt erhalten (ansonsten wäre die Suche nach diesen auch sehr Zeitaufwändig)