Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2018 12:19:37

TechMIke
Зарегистрирован: 2018-12-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг конфига ConfigObj

Есть задача найти в конфиге ключ и его значение и корневую секцию. Работаю под debian 8.5 и Python 2.7.9
Сам конфиг иерархический и выглядит так:

 [20]
    [[9901]]
    pdu_length = 10
    value_length = 2
	[[[8501000000000000]]]
	description = "T sensor 08501#1"
	oh_name = Temperature_8501000000000000
	value_modificator = "/100"
	value_sign = True
	little_endian = True
	is_interactive = False
	is_report = True
	sender_name = "Window_childrens_dimmer"
[19]
    [[8303]]
    pdu_length = 0
    value_length = 0
	[[[8303_fake]]]
	description = "Discharge sensor 8303"
	oh_name = LowPower_8303000000000000
	custom_value = "ON"
	is_interactive = False
	is_report = True
	sender_name = "Window_childrens_dimmer1"



Нужно найти sender_name по его значению и получить верхнюю к нему секцию.
Например для Window_childrens_dimmer1 нужно найти, ключ со значением sender_name = “Window_childrens_dimmer1” и получить его “верх ” = 19
Для Window_childrens_dimmer соответственно sender_name = “Window_childrens_dimmer” и 20

С помощью walk решается задача поиска ключа со значением, как найти “верх” для него придумать не могу. Нужна помощь.

P.S. Ключ ищу так:

 def gather_subsection_key(section, key, search_string, search_section, res):
	if key==search_section: 
		print ("=========FOUND KEY===============")
		print ("SECTION NAME:" + section.name)
		print ("SECTION DEPT:" + str(section.depth))
		print ("KEY:" + key)
		if section[key]==search_string:
			print ("=========FOUND VALUE=============")
			print ("SECTION:" + section.name)
			print ("KEY:" + key)
			print ("VALUE:" + section[key])
			print ("RETURNED:" + section.name)
			print ("=================================")
			res.append(section.name) 
conf = ConfigObj("/root/rs485_sniff/rs485dispatcher_sender.conf")
conf.walk(gather_subsection_key,call_on_sections=False,search_string=dict_var['name'],search_section="sender_name",res=walk_res)

Офлайн

#2 Дек. 5, 2018 13:33:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Python парсинг конфига ConfigObj

  
>>> import configobj
>>> import re
>>> 
>>> text = """
... [20]
...     [[9901]]
...     pdu_length = 10
...     value_length = 2
...     [[[8501000000000000]]]
...     description = "T sensor 08501#1"
...     oh_name = Temperature_8501000000000000
...     value_modificator = "/100"
...     value_sign = True
...     little_endian = True
...     is_interactive = False
...     is_report = True
...     sender_name = "Window_childrens_dimmer"
... [19]
...     [[8303]]
...     pdu_length = 0
...     value_length = 0
...     [[[8303_fake]]]
...     description = "Discharge sensor 8303"
...     oh_name = LowPower_8303000000000000
...     custom_value = "ON"
...     is_interactive = False
...     is_report = True
...     sender_name = "Window_childrens_dimmer1"
... """
>>> 
>>> config = configobj.ConfigObj(text.splitlines())
>>> 
>>> def search_node_in_tree(config, key, valpat):
...     for i in config:
...         for j in config[i]:
...             for k in config[i][j]:
...                 for l in config[i][j][k]:
...                     if (key == l
...                         and re.search(valpat, config[i][j][k][l])):
...                         return i, j, k
...     return None
... 
>>> search_node_in_tree(config, 'sender_name', 'dimmer$')
('20', '9901', '8501000000000000')
>>> search_node_in_tree(config, 'sender_name', 'dimmer1$')
('19', '8303', '8303_fake')
>>> search_node_in_tree(config, 'sender_name', 'Window')
('20', '9901', '8501000000000000')
>>>



Офлайн

#3 Дек. 7, 2018 09:45:48

TechMIke
Зарегистрирован: 2018-12-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Python парсинг конфига ConfigObj

Помогло, спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version