2009-07-15 2 views
6

Я заметил с моим исходным контролем, что содержимое выходных файлов, сгенерированных с помощью ConfigParser, никогда не находится в одном порядке. Иногда разделы меняют место или параметры внутри разделов даже без каких-либо изменений в значениях.Сохранять выходные файлы ConfigParser

Есть ли способ сохранить сортировку данных в файле конфигурации, чтобы мне не приходилось совершать тривиальные изменения при каждом запуске приложения?

+0

[Этот ответ] (http://stackoverflow.com/questions/1984759/export-with-alphabetical-sort-in-python-configparser/1984787#1984787) к аналогичному вопросу дает некоторые предложения о том, как выполнить сортировку вывода в Python 2. –

ответ

8

Похоже, это было зафиксировано в Python 3.1 и 2.7 с введением упорядоченных словарей:

Стандартная библиотека теперь поддерживает упорядоченных словарей в нескольких модулях . Модуль configparser использует по умолчанию . Это позволяет считывать, изменять, конфигурационные файлы, а затем записываться в их первоначальном заказе.

+0

Дох. Полезно, но нужно подождать несколько лет, прежде чем мы сможем использовать его в производстве ... – pihentagy

+3

В Python 2.7 вы можете 'из коллекций импортировать OrderedDict' и использовать' ConfigParser (dict_type = OrderedDict) ', чтобы заставить парсер использовать упорядоченный словарь. Основываясь на минимальном количестве тестов, я думаю, что это должно послужить вам хорошо. – eksortso

+2

В Python 2.7 вам не нужно это делать, это значение по умолчанию. –

3

№. Библиотека ConfigParser записывает информацию в хэш-порядке словаря. (Вы можете видеть это, если смотрите исходный код.) Есть замены для этого модуля, которые делают лучшую работу.

Я посмотрю, найду ли я его и добавлю здесь.

http://www.voidspace.org.uk/python/configobj.html#introduction это тот, о котором я думал. Это не замена, но очень проста в использовании.

-1

ConfigParser основан на формате ini-файла, который в своем дизайне не должен быть чувствительным к порядку. Если ваш формат файла конфигурации чувствителен к порядку, вы не можете использовать ConfigParser. Он также может сбить людей с толку, если у вас есть формат INI-типа, который чувствителен к порядку заявлений ...

+2

По-прежнему полезно, чтобы элементы выходили в том же порядке, если вы управляете версиями и хотите видеть разумные различия между версиями и версиями. – Arkady

+0

Ах, право. Я полностью пропустил, что вы создавали файлы. Виноват. Это configPARSER в конце концов. ;) –

0

Если вы хотите взять его на шаг дальше, чем ответ Александра Ljungberg и также отсортировать разделы и содержание разделов вы можете использовать следующее:

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) 

Это использует OrderdDict словари (держать упорядочивание) и сортирует прочитанный ini-файл извне ConfigParser, перезаписывая внутренний словарь словарей.

Смежные вопросы