2017-09-03 126 views
2

我已經回顧了一些類似的問題在stackoverflow,但無法找到一個適用於我的數據/字符串的答案。Python字符串到Dicts列表

我有一個字符串,它實際上是一個字典列表。在字段中,數字不會被雙引號包圍。如果我嘗試使用ast來評估字符串,部分字符串被切斷,我不確定原因。有人可以幫助我確定一個合適的方法來讀取這個字符串並創建一個字典列表。

感謝,

>>> print(ascii_data) 
    [{"measurement": "cpu_load_short","tags": {"host": "server999","region": "us-west-1"},"fields": {"value": 0.99}},{"measurement": "cpu_load_short","tags": {"host": "server888","region": "us-east-1"},"fields": {"value": 0.88}}] 
>>> x = ast.literal_eval(ascii_data) 
>>> print(x) 
    [{'fields': {'value': 0.99}, 'tags': {'host': 'server999', 'region': 'us-west-1'}, 'measurement': 'cpu_load_short'}, {'fields': {'value': 0.88}, 'tags': {'host': 'server888', 'region': 'us-east-1'}, 'measurement': 'cpu_load_short'}] 
+3

沒有被切斷。這是一本字典,因此順序是任意的。 –

+0

AWS API返回JSON數據 –

回答

0

考慮:

>>> s 
'[{"measurement": "cpu_load_short","tags": {"host": "server999","region": "us-west-1"},"fields": {"value": 0.99}},{"measurement": "cpu_load_short","tags": {"host": "server888","region": "us-east-1"},"fields": {"value": 0.88}}]' 

您可以使用json

>>> import json 
>>> json.loads(s) 
[{u'fields': {u'value': 0.99}, u'tags': {u'host': u'server999', u'region': u'us-west-1'}, u'measurement': u'cpu_load_short'}, {u'fields': {u'value': 0.88}, u'tags': {u'host': u'server888', u'region': u'us-east-1'}, u'measurement': u'cpu_load_short'}] 

或者ast

>>> import ast 
>>> ast.literal_eval(s) 
[{'fields': {'value': 0.99}, 'tags': {'host': 'server999', 'region': 'us-west-1'}, 'measurement': 'cpu_load_short'}, {'fields': {'value': 0.88}, 'tags': {'host': 'server888', 'region': 'us-east-1'}, 'measurement': 'cpu_load_short'}] 

他們產生相同的Python數據結構(至少用ascii輸入...):

>>> json.loads(s)==ast.literal_eval(s) 
True 

因爲在每種情況下結果是Python dict知道順序可能不同於字符串的順序。 Python字典是無序的,通常與創建順序不同(至少在Python 3.6之前)。


下的Python 3.6,它們產生字典是在同一順序:

>>> json.loads(s) 
[{'measurement': 'cpu_load_short', 'tags': {'host': 'server999', 'region': 'us-west-1'}, 'fields': {'value': 0.99}}, {'measurement': 'cpu_load_short', 'tags': {'host': 'server888', 'region': 'us-east-1'}, 'fields': {'value': 0.88}}] 
>>> ast.literal_eval(s) 
[{'measurement': 'cpu_load_short', 'tags': {'host': 'server999', 'region': 'us-west-1'}, 'fields': {'value': 0.99}}, {'measurement': 'cpu_load_short', 'tags': {'host': 'server888', 'region': 'us-east-1'}, 'fields': {'value': 0.88}}] 

的Python 3.6是偉大的......

+0

請注意,[Python 3.6 dicts](https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-compactdict)會保持順序。雖然它被認爲是不可靠的實現細節,但未來可能會改變。 –

+0

@JohnB:添加示例。謝謝 – dawg

0

使用JSON。

In [1]: s = '''[{"measurement": "cpu_load_short","tags": {"host": "server999","region": "us-west-1"},"fields": {"value": 0.99}},{"measuremen 
    ...: t": "cpu_load_short","tags": {"host": "server888","region": "us-east-1"},"fields": {"value": 0.88}}]''' 

In [2]: import json 

In [3]: import pprint 

In [4]: pprint.pprint(json.loads(s)) 
[{'fields': {'value': 0.99}, 
    'measurement': 'cpu_load_short', 
    'tags': {'host': 'server999', 'region': 'us-west-1'}}, 
{'fields': {'value': 0.88}, 
    'measurement': 'cpu_load_short', 
    'tags': {'host': 'server888', 'region': 'us-east-1'}}] 
In [11]: json.loads(s)[0]['tags']['host'] 
Out[11]: 'server999' 
0

json.loads怎麼樣?

j = json.loads(ascii_data) 

ast.literal_eval可能不是最好的選擇。如果您的數據源來自某個API,那肯定會是json格式。

如果dict鍵的順序對您很重要,請嘗試爲JSONDecoder指定object_pairs_hook參數。 (參考:Can I get JSON to load into an OrderedDict in Python?