2017-01-12 4 views
1

Использование Python 3.5.2, что является лучшим способом преобразования строки в список словарей?Преобразование строки в список словарей Python3

Я выскабливание сайта, со следующим возвращаются в виде списка длина 1:

(отформатированный для удобства чтения)

[ 
{"variation_id":573,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":1099,"display_regular_price":1099,"attributes":{"attribute_pa_size":"king"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>1,099.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211693","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""}, 

{"variation_id":574,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":989,"display_regular_price":989,"attributes":{"attribute_pa_size":"queen"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>989.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211686","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""}, 

{"variation_id":575,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":949,"display_regular_price":949,"attributes":{"attribute_pa_size":"double"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>949.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211679","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""} 

] 

Я попытался преобразованием, что на ул, присвоив его 's', а затем используя json.loads (s), но это не сработало.

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

for item in form_data_returned: 
    print item['variation_id'] # prints 573 574 575 

Благодарности

+0

'ast.literal_eval (my_str)' – inspectorG4dget

+1

@ inspectorG4dget Я думаю, что 'literal_eval' подавится на нижнем регистре' true' –

+1

не может просто разобрать это как [ 'json'] (https: // docs.python.org/3/library/json.html)? Как точно это не сработало? Ага, кажется, задыхается от некоторых экранированных '\" '... –

ответ

2
from collections import defaultdict 

# Set aliases for `true` and `false` in the output so 
# we won't get NameError exceptions thrown. 
true = True 
false = False 

raw = [ 
{"variation_id":573,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":1099,"display_regular_price":1099,"attributes":{"attribute_pa_size":"king"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>1,099.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211693","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""}, 

{"variation_id":574,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":989,"display_regular_price":989,"attributes":{"attribute_pa_size":"queen"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>989.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211686","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""}, 

{"variation_id":575,"variation_is_visible":true,"variation_is_active":true,"is_purchasable":true,"display_price":949,"display_regular_price":949,"attributes":{"attribute_pa_size":"double"},"image_src":"","image_link":"","image_title":"","image_alt":"","image_caption":"","image_srcset":"","image_sizes":"","price_html":"<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#82;<\/span>949.00<\/span><\/span>","availability_html":"<p class=\"stock in-stock\">2 in stock<\/p>","sku":"6006239211679","weight":" kg","dimensions":"","min_qty":1,"max_qty":2,"backorders_allowed":false,"is_in_stock":true,"is_downloadable":false,"is_virtual":false,"is_sold_individually":"no","variation_description":""} 

] 

# keys being a set ensures that every key occurs only once. 
keys = set() 

# Initializing form_data_returned as a defaultdict allows 
# us to access keys that are not already in form_data_returned. 
# For example form_data_returned['weight'].append('kg') would throw 
# KeyError exception for an empty form_data_returned had we declared 
# it as a normal dict(). 
form_data_returned = defaultdict(list) 

for dictionary in raw: 
    keys.update(dictionary.keys()) 
    for key in keys: 
     form_data_returned[key].append(dictionary[key]) 

Теперь мы можем получить данные по ключевым:

print(form_data_returned['variation_id']) 
>>> [573, 574, 575] 
0

Используйте модуль re для предварительной обработки строки, затем используйте модуль json t o проанализировать его в словаре.

Если у вас есть данные, преобразованные в строку, и вы знаете, что определенные правила применяются к содержанию *, вы можете попробовать следующее:

str = '...' 

escaped = re.sub('(?<=[^,:{}])(\\\")(?=[^,:{}])','\\"',str) 

dict = json.loads(escaped) 

Регулярное выражение (?<=[^,:{}])(\\\")(?=[^,:{}]) будет разобрать строку и определить все символы ", которым не предшествует ',' , ':' , '{', '}', или за ними следует то же самое, так что " в строках данных может быть экранировано должным образом.

* по правилам я имею в виду, что вы должны знать, что используется регулярное выражение находит правильные символы - если источник данных может обеспечить, что последовательность, приведенный выше код должен работать (расширить (?<=[^,:{}]) и (?=[^,:{}]) части с необходимым символы, чтобы соответствовать всем данным

Смежные вопросы