Как использовать configparser с именами разделов, соответствующими шаблону - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно прочитать INI-файл, используя configparser, где имя раздела немного отличается в разных версиях файла (в зависимости от того, из какой ветви этот файл).

, поэтому в некоторых файлах имена разделовявляются:

[WEB - Component1_Build]
option1=foo
option2=bar

[WEB - Component2_Build]
option3=foo
option4=bar

[WEB - Component3_Build]
option5=foo
option6=bar

В приведенном выше примере все компоненты были собраны из «ветви по умолчанию».

Но в другом файле, который должен обрабатывать тот же код, имена разделовможет быть:

[WEB - Component1_Build - my_feature_branch]
option1=foo
option2=bar

[WEB - Component2_Build]
option3=foo
option4=bar

[WEB - Component3_Build - my_feature_branch]
option5=foo
option6=bar

В вышеприведенном примере компоненты 1 и 3 построены из ветви функций, а компонент 2 построен из ветви по умолчанию.

Другой пример,

[WEB - Component1_Build - prod_release_branch]
option1=foo
option2=bar

[WEB - Component2_Build - prod_release_branch]
option3=foo
option4=bar

[WEB - Component3_Build - prod_release_branch]
option5=foo
option6=bar

[WEB - Component4_Build - prod_release_branch]
option7=foo
option8=bar

В приведенном выше примере есть дополнительный компонент, но все строятся из ветки релиза.

В моем коде на Python я ищу использовать какой-то уровень или шаблонсовпадения или регулярные выражения для имен разделов, но я не уверен, как это сделать.

Я попытался найти файл configparser.SECTCRE, чтобы настроить поведение анализатора, но я не уверен, как это сделать. потренируйся.


config = configparser.ConfigParser()

# not sure if this is right
config.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")

config.read("my_ini_file.ini")
print(config.sections())

# this works, but I would want to fetch the section using component name
print(config.options(config.sections()[0]))

# this doesn't work and I get an error
# error is: configparser.NoSectionError: No section: '(Component1)+'
print(config.options(r'(Component1)+'))

# these work, but I would want to fetch the section using component name
print(config.get(config.sections()[0], 'option1'))
print(config.get(config.sections()[0], 'option2'))

error is: configparser.NoSectionError: No section: '(Component1)+'
...