Конвертировать строку в Dict / JSON - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь преобразовать следующий фрагмент данных в dict, чтобы у меня была пара ключ: значение и чтобы они были вложенными:

data="Group A\n name : rey\n age : 6\n status : active\n in role : 201\n weight : 25\n interests\n Out Side : 16016\n In Side : 0\n Out : 2804\n\n name : dan\n age : 5\n status : inactive\n in role : 201\n weight : 18\n interests\n Out Side : 16016\n In Side : 0\n Out : 2804\n\n"

Проблема в том, что не все из них имеют :и некоторые из них должны быть сгруппированы (то есть часть Group A).\n разрыв строки определенно помогает мне их разделить.

Вот результат, который я надеюсь получить:

[
 {
  "Group A":
   [
    {"name": "rey", "age": "6", "status": "active"},
    {"name": "dan", "age": "5", "status": "inactive"}
   ]
 }
]

Что у меня сейчас?Я разделил некоторые из них на dict с помощью:

result = {}
for row in data.split('\n'):
  if ':' in row:
    key, value = row.split(':')
    result[key] = value.strip()

Это выводит меня:

{' name ': 'dan', ' weight ': '18', ' In Side ': '0', ' Out ': '2804', ' in role ': '201', ' status ': 'inactive', ' Out Side ': '16016', ' age ': '5'} Но это портит существующий порядок, в котором данные показаны выше- и не все вышло.

Я вроде как собираю эти данные из внешней программы и поэтому ограничен только Python версии 2.7.Любые идеи будут очень полезны!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я буду использовать setdefault для создания новых списков в вашей группе.Это будет работать для нескольких групп, если у вас есть группы B, C, D ...

import json

def convert_string(data):
    result = {}
    current = ""
    key_no = -1
    for pair in data.split("\n"):
        if ':' not in pair:
            if "Group" in pair:
                result.setdefault(pair,[])
                current = pair
                key_no = -1
        elif "name" in pair:
            result[current].append({})
            key_no +=1
            key, value = pair.split(':')
            result[current][key_no][key.strip()] = value.strip()
        elif all(s not in pair.lower() for s in ("weight","in role","out","in side")):
            key, value = pair.split(':')
            result[current][key_no][key.strip()] = value.strip()
    return result

print (json.dumps(convert_string(d),indent=4))

{
    "Group A": [
        {
            "name": "rey",
            "age": "6",
            "status": "active"
        },
        {
            "name": "dan",
            "age": "5",
            "status": "inactive"
        }
    ]
}
0 голосов
/ 23 октября 2018

Вы должны найти шаблон в ваших данных:

  • Ваши данные разделены пустыми строками
  • Внутренние данные начинаются с пробела

Использованиеэти наблюдения вы можете написать:

def parse(data):
    aa = {}
    curRecord = None
    curGroup  = None

    for row in data.split('\n'):
        if row.startswith(' '): 
            # this is a new key in the inner record
            if ':' in row :
                if curRecord == None:
                    curRecord = {}
                    curGroup.append(curRecord)
                key, value = row.split(':')
                curRecord[key.strip()] = value.strip()
        elif row == '': 
            # this signal new inner record
            curRecord = None
        else: 
            # otherwise , it is a new group
            curRecord = None
            curGroup = []
            aa[row.strip()] = curGroup
    return aa

>>> import json
>>> print( json.dumps(parse(data)) );    
{"Group A": [{"name": "rey", ... }, {"name": "dan", ... }]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...