2009-07-15 19 views
6

Ich habe mit meiner Quellcodeverwaltung festgestellt, dass der Inhalt der mit ConfigParser generierten Ausgabedateien nie in der gleichen Reihenfolge ist. Manchmal ändern Abschnitte den Platz oder die Optionen innerhalb von Abschnitten, auch ohne Änderungen an den Werten.Keep ConfigParser Ausgabedateien sortiert

Gibt es eine Möglichkeit, die Dinge in der Konfigurationsdatei sortiert zu halten, so dass ich nicht jedes Mal, wenn ich meine Anwendung starte, geringfügige Änderungen vornehmen muss?

+0

[Diese Antwort] (http://stackoverflow.com/questions/1984759/export-with-alphabetical-sort-in-python-configparser/1984787#1984787) auf eine ähnliche Frage gibt einige Vorschläge, wie sortierte zu erreichen Ausgabe in Python 2. –

Antwort

8

Sieht aus wie dies in Python 3.1 und 2.7 mit der Einführung geordneter Wörterbücher festgelegt wurde:

Die Standardbibliothek unterstützt jetzt die Verwendung von geordneten Wörterbüchern in mehreren Modulen. Das Configparser-Modul verwendet standardmäßig . Dadurch können Konfigurationsdateien gelesen, geändert, und dann in ihre ursprüngliche Reihenfolge zurückgeschrieben werden.

+0

Doh. Nützlich, aber muss einige Jahre warten, bevor wir es in der Produktion verwenden können ... – pihentagy

+3

In Python 2.7 können Sie 'from Collections OrderedDict' importieren und' ConfigParser (dict_type = OrderedDict) '' verwenden, damit der Parser ein geordnetes Dictionary verwendet. Basierend auf einer minimalen Anzahl von Tests, denke ich, sollte dies Ihnen gut tun. – eksortso

+2

In Python 2.7 müssen Sie das nicht tun, es ist der Standard. –

3

Nein. Die ConfigParser-Bibliothek schreibt Dinge in einer Wörterbuch-Hash-Reihenfolge. (Sie können dies sehen, wenn Sie sich den Quellcode ansehen.) Es gibt Ersatz für dieses Modul, die einen besseren Job machen.

Ich werde sehen, ob ich einen finden und es hier hinzufügen kann.

http://www.voidspace.org.uk/python/configobj.html#introduction ist derjenige, an den ich dachte. Es ist kein Drop-In-Ersatz, aber es ist sehr einfach zu bedienen.

-1

ConfigParser basiert auf dem INI-Dateiformat, das in seinem Design NICHT auf Bestellung empfindlich sein soll. Wenn das Format Ihrer Konfigurationsdatei für die Reihenfolge empfindlich ist, können Sie ConfigParser nicht verwenden. Es kann auch Menschen verwirren, wenn Sie ein ini-Typ-Format haben, die die Reihenfolge der Aussagen empfindlich ist ...

+2

Es ist immer noch hilfreich, die Elemente in der gleichen Reihenfolge kommen zu lassen, wenn Sie die Ergebnisse versionieren und sinnvoll aussehende Diffs von Version zu Version sehen wollen. – Arkady

+0

Ah, richtig. Ich habe komplett vermisst, dass Sie Dateien erstellt haben. Mein Fehler. Es ist immerhin configPARSER. ;) –

0

Wenn Sie noch einen Schritt weiter als Alexander Ljungberg Antwort nehmen wollen und sortieren auch die Abschnitte und die Inhalte der Abschnitte können Sie die folgende verwenden:

config = ConfigParser.ConfigParser({}, collections.OrderedDict) 
config.read('testfile.ini') 
# Order the content of each section alphabetically 
for section in config._sections: 
    config._sections[section] = collections.OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) 

# Order all sections alphabetically 
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) 

# Write ini file to standard output 
config.write(sys.stdout) 

Dies verwendet OrderdDict Wörterbücher (zu halten Ordnen) und sortiert die gelesene Ini-Datei von außerhalb ConfigParser durch das Überschreiben des internen _sections Wörterbuchs.