Распарсить conf файл с одинаковыми именами секций
подскажите, каким образом можно распарсить файл *.conf, который содержит одинаковые секции, например:
[section]
name = value
test1 = 1
test2 = 3
test3 = 4
[section]
name = value2
test1 = 11
test2 = 33
test3 = 44
[section]
name = value3
test1 = 111
test2 = 333
test3 = 444
Стандартные библиотеки(configparser, configObj) ругаются на дубликаты секций. В случае, в configparser передавать параметр strict = False, то возвращается лишь последняя секция, тогда как их там огромное количесвто.
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
Ну вот в порядке эксперимента можно попробовать pandas:
mport pandas as pd
df = pd.read_csv("cfg.cfg", header=None)
df["grp"]=df[0].str.contains(r"\[").astype("int").cumsum()
grp = [g[0][1:].tolist() for i, g in df.groupby('grp')]
в grp у вас теперь список списков. Например, grp[0]:
['name = value', 'test = 1', 'test = 3', 'test = 4']
Автор решения: insolor
→ Ссылка
Ручной парсинг с проходом по файлу построчно (считаем, что у всех секций имя [section]):
sections = []
with open("sections.conf") as file:
current_object = None
for line in file:
if line.strip() == "[section]":
if current_object is not None:
sections.append(current_object)
current_object = dict()
elif current_object is not None:
key, sep, value = map(str.strip, line.partition("="))
if not sep:
print("Отустствует = в строке", line)
continue
current_object[key] = value
if current_object:
sections.append(current_object)
from pprint import pprint
pprint(sections)
Для примера файла из вопроса будет такой результат:
[{'name': 'value', 'test1': '1', 'test2': '3', 'test3': '4'},
{'name': 'value2', 'test1': '11', 'test2': '33', 'test3': '44'},
{'name': 'value3', 'test1': '111', 'test2': '333', 'test3': '444'}]