Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串到dict列表_Python_List_Dictionary_Abstract Syntax Tree - Fatal编程技术网

Python字符串到dict列表

Python字符串到dict列表,python,list,dictionary,abstract-syntax-tree,Python,List,Dictionary,Abstract Syntax Tree,我已经回顾了许多关于stackoverflow的类似问题,但找不到适用于我的数据/字符串的答案 我有一个字符串,它实际上是一个字典列表。在字段中,数字不被双引号包围。如果我尝试使用ast来计算字符串,字符串的一部分会被切断,我不确定为什么。有人能帮我确定一个合适的方法来读入这个字符串并创建一个目录列表吗 谢谢 >>> print(ascii_data) [{"measurement": "cpu_load_short","tags": {"host": "server99

我已经回顾了许多关于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

j = json.loads(ascii_data)
ast.literal\u eval
可能不是最佳选择。如果您的数据源来自某个API,那么它肯定是json格式的

如果dict键的顺序对您很重要,请尝试将object\u pairs\u hook参数指定给JSONDecoder。(参考:)

给出:

>>> 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输入…):

因为在每种情况下,结果都是Python
dict
,所以要知道顺序可能不同于字符串的顺序。Python dict是无序的,通常与创建顺序不同(至少在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很棒…

没有任何东西被切断。它是一个字典,因此顺序是任意的。AWS API返回不保留顺序的JSON数据注释。不过,它被认为是一个不可依赖的实现细节,但将来可能会发生变化。@JohnB:Example added。谢谢
>>> 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}}]