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.