Разбор файла конфигурации с Python, имеющего более одной переменной с одинаковым именем

Есть ли способ проанализировать файл конфигурации, как это с Python3?

path = .MyAppData
prefer = newer
path = Dokumente

Пожалуйста, не вините меня.;) Я не создавал программное обеспечение, производящее файлы конфигурации, подобные этому. Но они имеют смысл в этом особом контексте.

я знаю ConfigParser а также configobj для Python3, но не вижу способа сделать это.

1 ответ

Решение

ConfigParser инициализатор поддерживает strict=False аргумент, который позволяет дубликаты. Но какое значение сохраняется в этом случае, насколько я могу судить, не указано в документации.

Одно простое решение - преобразовать строки в словарь самостоятельно;

In [1]: txt = '''path = .MyAppData
   ...: prefer = newer
   ...: path = Dokumente'''

In [2]: txt.splitlines()
Out[2]: ['path = .MyAppData', 'prefer = newer', 'path = Dokumente']

(После разделения текста на строки вы можете отфильтровать комментарии и пустые строки.)

In [3]: [ln.split('=') for ln in txt.splitlines()]
Out[3]: [['path ', ' .MyAppData'], ['prefer ', ' newer'], ['path ', ' Dokumente']]

In [4]: vars = [ln.split('=') for ln in txt.splitlines()]

(На этом этапе вы можете добавить фильтр для внутренних списков, чтобы у вас были только списки длиной 2, что указывает на успешное разделение.)

In [5]: {a.strip(): b.strip() for a, b in vars}
Out[5]: {'path': 'Dokumente', 'prefer': 'newer'}

В понимании dict (в [5]) более поздние назначения будут иметь приоритет перед более ранними.

Конечно, если prefer = olderВы должны были бы полностью изменить линии прежде, чем понимание dict.

Другие вопросы по тегам