2017-09-03 15 views
2

私はstackoverflowに関する多くの同様の質問を見直しましたが、自分のデータ/文字列に適用される回答を見つけることができませんでした。DictsのリストへのPythonの文字列

私は効果的に辞書のリストである文字列を持っています。フィールドでは、数字は二重引用符で囲まれていません。文字列を評価するために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のデータ構造を(生産アスキー入力...):

>>> 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キーの順序が重要な場合は、object_pairs_hook引数をJSONDecoderに指定してみてください。 (参照:Can I get JSON to load into an OrderedDict in Python?

関連する問題