Найти - Пользователи
Полная версия: Python парсинг конфига ConfigObj
Начало » Python для новичков » Python парсинг конфига ConfigObj
1
TechMIke
Есть задача найти в конфиге ключ и его значение и корневую секцию. Работаю под 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)
py.user.next
  
>>> 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')
>>>
TechMIke
Помогло, спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB