LINUX.ORG.RU

Преобразовать строку в словарь

 


1

2

Имеется строка приблизительно следующего вида:

NAME1 = {NAME2 = {Test.Sample.One = 11;Test.Sample.Two = 12;Test.Sample.Three = 13;};};

Есть желание её разобрать но нет желания делать это вручную. Попробовал питон: модули json и ast не понимают такую структуру:

>>> string = 'NAME1 = {NAME2 = {Test.Sample.One = 11;Test.Sample.Two = 12;Test.Sample.Three = 13;};};'
>>> print string
NAME1 = {NAME2 = {Test.Sample.One = 11;Test.Sample.Two = 12;Test.Sample.Three = 13;};};
>>> import json
>>> json.loads(string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
>>> import ast
>>> ast.literal_eval(string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib64/python2.6/ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    NAME1 = {NAME2 = {Test.Sample.One = 11;Test.Sample.Two = 12;Test.Sample.Three = 13;};};
          ^
SyntaxError: invalid syntax

На что это похоже и есть ли стандартные инстурменты для такого рода структур? Не обязательно питон.

★★★★★


In [1]: import json                                                                                                    

In [2]: NAME1 = '{"NAME2": {"Test.Sample.One":11, "Test.Sample.Two":12, "Test.Sample.Three":13}}'                      

In [3]: x = json.loads(NAME1)                                                                                          

In [4]: x                                                                                                              
Out[4]: 
{'NAME2': {'Test.Sample.One': 11,
  'Test.Sample.Two': 12,
  'Test.Sample.Three': 13}}

ggrn ★★★★★
()
Ответ на: комментарий от ggrn

То есть, нужно заменить все последующие знаки равно на двоеточия а точки с запятой на запятые? Можно рассмотреть этот ваирант, но это fallback

sin_a ★★★★★
() автор топика
Ответ на: комментарий от ggrn

Что это неправильный json я уже понял. Но раз такое существует то этим кто-то пользуется. Вот я и подумал что это может быть какая нибудь стандартная структура.

sin_a ★★★★★
() автор топика
Ответ на: комментарий от sin_a

Что это неправильный json я уже понял

в смысле, что это вообще не json?

хз, что такое. надо ручками или парсер писать, или грамматику

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Если действительно нестандартное то проще, как советовали, заменить символы. Только удостовериться что данные не могут побиться.

sin_a ★★★★★
() автор топика

Выглядит как какой-то candlescript или диалект JS-а

Dred ★★★★★
()
Ответ на: комментарий от sin_a

удостовериться что данные не могут побиться

можно погрепать входные данные, и молиться, что ничего неожиданного впредь не появится

MyTrooName ★★★★★
()

А чтобы ответить на вопрос «что же это такое?» надо знать хотя бы откуда ты это взял :).

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

ПО отдаёт статистику в таком виде. Поставщик сказал что обычно это заббикс отображает целиком... ХЗ что имел в виду.

Замена символов помогла не сильно потому что в конце остаются лишние точки с запятой. Парсер php тоже сказал что ему эти лишние разделители не нравятся.

sin_a ★★★★★
() автор топика
Ответ на: комментарий от Novator

Частично помогло, но строка имеет вид NAME1 = {NAME2 = {some.content;};}; причём NAME1 это не название а часть строки. То есть оно лишний раз вложено. Вообще у меня такое впечатление что я уже начал делать парсер. Может надо просто его и делать.

sin_a ★★★★★
() автор топика
8 июня 2019 г.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

from pyparsing import Word, alphas, nums, Optional, OneOrMore, Group, Forward

var    = Word(alphas + nums + '.' + '_')
number = Word(nums + ".-")

Xvar  = var + Optional('=' + number) + ';'

Xlist = Forward()
Xlist << var + '=' + '{' + OneOrMore(Group(Xvar|Xlist)) + '}' + ';'
Xall  = OneOrMore(Group(Xlist))

source = '''
NAME.1 = {NAME1_1 = {Some.One.Count = 4;   Some.Two.Count = 0; };
          NAME1_2 = {Some.One.Error = 124; Some.Two.Error = 0.000000; };
          NAME1_3 = {Something; SomeMore; };
        };
NAME.2 = {NAME2_1 = {Some.One.Count = 21; Some.Two.Count = 0; };
          NAME2_2 = {Some.One.Error = 0;  Some.Two.Error = 0.000000; };
          NAME2_3 = {Something; SomeMore; };
        };
NAME.3 = {NAME3_1 = {Some.One.Count = 3; Some.Two.Count = 0; };
          NAME3_2 = {Some.One.Error = 1; Some.Two.Error = 0.000000; };
          NAME3_3 = {Something; SomeMore; };
        };"
'''

for i in Xall.parseString(source):
    print i
sin_a ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.