2016-02-12 2 views
2

Я пытаюсь преобразовать следующую строку в словарь, где IP становится ключом, а все остальное после | становится значением:Как преобразовать строку в dict escaping специальных символов в python

my_string = '''10.11.22.33|{"property1": "0",  "property2": "1", "property3":  "1", "property4": "1", "property5": "0"} 
10.11.22.34|{"property1": "0",  "property2": "0", "property3":  "1", "property4": "1", "property5": "0", "property6": "0", "property7": "1", "property8": "0", "property9": "0", "property10": "1"}''' 

Это код, который я попробовал:

d = dict(node.split('|') for node in my_string.split()) 

Однако, я получаю эту ошибку:

ValueError: dictionary update sequence element #1 has length 1; 2 is required 

Так что упростило my_string на одну строку:

my_string = '10.11.22.33|{"property1": "0",  "property2": "1", "property3":  "1", "property4": "1", "property5": "0"}' 

И использовал этот код для первого sp освещено строку:

wow = my_string.split('|') 

выход:

['10.11.22.33', '{"property1": "0",  "property2": "1", "property3":  "1", "property4": "1", "property5": "0"}'] 

, приведенный выше список из двух элементов. Однако, когда я пытаюсь создать словарь из него, он терпит неудачу с этой ошибкой:

d = dict(wow) 

выход:

ValueError: dictionary update sequence element #0 has length 11; 2 is required 

Я не хочу, чтобы изменить значение - он должен быть сохранен как , Каков правильный способ получить эту строку в словаре, чтобы она выглядела так:

{'10.11.22.33': '{"property1": "0",  "property2": "1", "property3":  "1", "property4": "1", "property5": "0"}'} 

Это Python 2.6.

ответ

1

Ваш первый подход правильный, за исключением того, что он разбивается не на то, потому что str.split() использует пробел как символ разделителя по умолчанию. Попробуйте str.splitlines() вместо:

d = dict(node.split('|') for node in my_string.splitlines()) 
+0

Это работает и просто. Читайте где-нибудь, что раскол расщепляется на новых персонажах линии ... Должно быть, мечтал. Угадайте, что пришло время отдохнуть. – Lidia

2

Вы должны split вашу строку на \n первый:

dict(ip.split('|') for ip in s.split('\n')) 

Также вы посмотрите в re.findall может:

dict(re.findall(r'(\d+\.\d+\.\d+\.\d+\d+).*?(\{.*?\})', s)) 

Где s это ваша строка

+0

Не расщепление на новой линии было проблемой. – Lidia

+0

В чем проблема? в соответствии с вашим комментарием это был вопрос – tinySandy

+0

Извините, я не был ясен - проблема в том, что я не раскалывался на новой строке. – Lidia