[英]Python String to List of Dicts
我已經查看了關於stackoverflow的許多類似問題,但是無法找到適用於我的數據/字符串的答案。
我有一個有效地是字典列表的字符串。 在字段中,數字沒有用雙引號引起來。 如果我嘗試使用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'}]
使用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'
json.loads
怎么json.loads
?
j = json.loads(ascii_data)
ast.literal_eval
可能不是最佳選擇。 如果您的數據源來自某個API,則肯定是json格式。
並且,如果dict鍵的順序對您很重要,請嘗試為JSONDecoder指定object_pairs_hook參數。 (參考: 我可以讓JSON加載到Python中的OrderedDict嗎? )
鑒於:
>>> 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下,它們產生的dict的順序相同:
>>> 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很棒...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.