Re: INI-Datei einlesen, trotz fehlenden Sektionen/Optionen
Verfasst: Sonntag 24. April 2016, 14:15
Ich habe nochmals über die Problematik des Zusammenfassens der Konfigurationen nachgedacht und herausgekommen ist folgendes Programm. Dieses sollte nun soweit funktionieren, wie in meiner ersten Antwort aufgezeichnet. Darüber hinaus verwendet die get_configuration-Funktion nunmehr einen Dateiobjekt, so spielt es besser mit Sirius3s Beispiel zusammen:
Hier bietet sich ein Blick in die Dokumentation zu itertools und zu LC/DC im Allgemeinen an.
PS: Ich nutze ausschließlich Python 3.5., configparser.ConfigParser.read_file im obigen Beispiel müsste ggf. durch readfp ersetzt werden. readfp ist ab Python 3.2 veraltet.
Code: Alles auswählen
#!/usr/bin/env python3
import configparser
import itertools
def get_configuration(file_object): # -> dict
parser = configparser.ConfigParser()
parser.read_file(file_object)
return {section: dict(parser.items(section))
for section
in parser.sections()}
def merge_dicts(a, b): # -> dict
"""Merges two dicts prefering the values of the second one."""
return {k: v for k, v in itertools.chain(a.items(), b.items())}
def merge_configurations(a, b): # -> dict
# 1. Dafür Sorge trage, dass das Ergebnis die Sektionen beider
# Konfigurationen enthält. Hierzu bilde ich zunächst ein set
# (=Menge) über die Sektionsnamen beider Konfigurationen.
section_names = set(itertools.chain(a.keys(), b.keys()))
# 2. Dictionary erzeugen und die Inhalte der Sektionen
# zusammenfassen (merge_dicts). Hierbei werden die Inhalte des
# zweiten Konfiguration bevorzugt.
return {section_name: merge_dicts(a.get(section_name, {}),
b.get(section_name, {}))
for section_name
in section_names}
def main():
with open('default.ini') as default_config_file:
default_configuration = get_configuration(default_config_file)
with open('user.ini') as user_config_file:
user_configuration = get_configuration(user_config_file)
print(merge_configurations(default_configuration, user_configuration))
if __name__ == '__main__':
main()PS: Ich nutze ausschließlich Python 3.5., configparser.ConfigParser.read_file im obigen Beispiel müsste ggf. durch readfp ersetzt werden. readfp ist ab Python 3.2 veraltet.