ini-Datei mit ConfigParser verändern

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
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

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
gruss x-herbert
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.
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

probiere ich aus...
gruss x-herbert
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

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??
gruss x-herbert
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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)
Antworten