bevor ich an die frische Luft gehe und einen Spaziergang mache, möchte ich ein kleines Problem los werden. Ich habe ein kleines ausführbares Beispielprogramm geschrieben (siehe unten). Es geht darum, eine INI-Datei einzulesen bzw. gegebenenfalls eine INI-Datei zu erstellen.
Kurz zur Beschreibung: Wir sehen eine ConfigurationSaver()-Klasse. Dort habe ich für den Beispiel ein Wörterbuch gespeichert. Auffällig ist, dass in der write_ini_file()-Funktion absichtlich nur drei Sektionen mit den dazugehörigen Optionen geschrieben werden. In der read_ini_file() werden absichtlich 4 Sektionen mit den dazugehörigen Optionen gelesen - zumindest versucht. Es liegt in der Natur, dass dadurch in der Exception Fehler aufgeworfen werden. Diese werden auch abgefangen (seht mir an dieser Stelle nach, wenn ich für den Beispiel die Fehler nicht ordnungsgemäß behandle).
Jetzt zum Problem: Wenn ich also versuche die INI-Datei einzulesen, bricht mir das Programm ab. Logisch, denn es konnte keine Option namens fibonacci gefunden werden. Aber die Prozedur bricht für meinen Geschmack zu früh ab. Das heißt, die anderen Werte, die in der INI-Datei sind, werden nicht eingelesen, in das Wörterbuch gespeichert und angezeigt. Meine Idee ging dahin, dass, wenn eine Option fehlt, trotzdem die vorhandenen Werten in das Wörterbuch gespeichert werden.
Im alltäglichen Leben ist es üblich, dass das Programm eine neuere Version ist, aber die INI-Datei noch eine ältere Version ist. Das führt bekanntlich dazu, dass in der INI-Datei sowohl Optionen also auch Sektionen fehlen könnten. Ich glaube Sirius3 war es, der mich darauf hinwies, dass die INI-Datei erst dann modifiziert werden soll, wenn der Anwender es sich wünscht. Das heißt also, dass mein Programm die INI-Datei soweit einlesen soll, wie es ihm möglich ist, auch wenn Sektionen und Optionen fehlen.
Nun stecke ich gedanklich fest. Ich frage mich, was ich bei der Fehlerbehandlung anstellen soll, damit mein Programm "weiter" mach und die ihm bekannten Werte einliest und quasi auf die fehlenden Optionen und Sektionen erst einmal verzichtet. Dafür werden ja bestimmte Werte in das Wörterbuch "hart kodiert" - die eben als "Detault-Werte" dienen sollen.
Code: Alles auswählen
import ConfigParser
import os
import sys
import traceback
class ConfigurationSaver(object):
def __init__(self):
self.dict_general_settings = {
"Key1": "False",
"Key2": "False",
"Key3": "False",
"Key4": "False"
}
def check_file_exists(ini_file_path):
with open(ini_file_path, "r") as config_file: pass
def write_ini_file(config_parsing, ini_file_path, dict_settings):
section_name = "SECTION_1"
with open(ini_file_path, "w") as config_file:
config_parsing.add_section(section_name)
config_parsing.set(section_name, 'Foo', dict_settings.dict_general_settings["Key1"])
config_parsing.set(section_name, 'Bar', dict_settings.dict_general_settings["Key2"])
config_parsing.set(section_name, 'FiBaBo', dict_settings.dict_general_settings["Key3"])
config_parsing.write(config_file)
def read_ini_file(config_parsing, ini_file_path, dict_settings):
section_name = "SECTION_1"
config_parsing.read(ini_file_path)
dict_settings.dict_general_settings["Key1"] = config_parsing.get(section_name, 'Foo')
dict_settings.dict_general_settings["Key2"] = config_parsing.get(section_name, 'Bar')
dict_settings.dict_general_settings["Key3"] = config_parsing.get(section_name, 'FiBaBo')
dict_settings.dict_general_settings["Key4"] = config_parsing.get(section_name, 'fibonacci')
print "Foo", dict_settings.dict_general_settings["Key1"]
print "Bar", dict_settings.dict_general_settings["Key2"]
print "FiBaBo", dict_settings.dict_general_settings["Key3"]
print "FiBaBo", dict_settings.dict_general_settings["Key4"]
if __name__ == "__main__":
parsing_config = ConfigParser.SafeConfigParser()
dict_settings = ConfigurationSaver()
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
INI_FILE_PATH = os.path.join(BASE_PATH, 'config.ini')
try:
check_exists_file(INI_FILE_PATH)
try:
read_ini_file(parsing_config, INI_FILE_PATH, dict_settings)
except ConfigParser.NoSectionError, err:
desired_trace = traceback.format_exc(sys.exc_info())
print "NoSectionError:", desired_trace
except ConfigParser.NoOptionError, err:
desired_trace = traceback.format_exc(sys.exc_info())
print "NoOptionError:", desired_trace
except (OSError,IOError), e:
write_ini_file(parsing_config, INI_FILE_PATH, dict_settings)
