Превратить текстовый список в список в формате json - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть текстовый файл, который отформатирован следующим образом, каждый дефис представляет иерархию для элемента списка.

category1 : 0120391123123
- subcategory : 0120391123123
-- subsubcategory : 019301948109
--- subsubsubcategory : 013904123908
---- subsubsubsubcategory : 019341823908
- subcategory2 : 0934810923801
-- subsubcategory2 : 09341829308123
category2: 1309183912309
- subcategory : 10293182094
...

Как программно получить такой список в формате json, подобном следующему?

[
   {
      "category1":"0120391123123"
   },
   [
      {
         "subcategory":"0120391123123"
      },
      [
         {
            "subsubcategory":"019301948109"
         },
         [
            {
               "subsubsubcategory":"013904123908"
            },
            [
               {
                  "subsubsubsubcategory":"019341823908"
               }
            ]
         ]
      ]
   ],
   [
      {
         "subcategory2":"0934810923801"
      },
      [
         {
            "subsubcategory2":"09341829308123"
         }
      ]
   ],
   [
      {
         "category2":"1309183912309"
      },
      [
         {
            "subcategory":"10293182094"
         }
      ]
   ]
]

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

используйте рекурсивную функцию для разделения содержимого файла на куски и используйте разделяй и властвуй

from pprint import pprint
req=[]
startingindex=-1

with open('temp.txt' ,'r') as f:

    content=f.read().split('\n')    



def foo(splitcontent):
    index=0
    reqlist=[]
    while(index<len(splitcontent)):

        if (splitcontent[index][0]!='-'):
            key,value=splitcontent[index].split(':')
            reqlist.append({key.strip():value.strip()})
            index+=1
            templist=[]

            while(index<len(splitcontent) and splitcontent[index][0]=='-'):
                templist.append(splitcontent[index][1:])
                index+=1

            intermediatelist=foo(templist)
            if(intermediatelist):
                reqlist.append(intermediatelist)
    return reqlist
pprint(foo(content))

OUTPUT

[{'category1': '0120391123123'},
 [{'subcategory': '0120391123123'},
  [{'subsubcategory': '019301948109'},
   [{'subsubsubcategory': '013904123908'},
    [{'subsubsubsubcategory': '019341823908'}]]],
  {'subcategory2': '0934810923801'},
  [{'subsubcategory2': '09341829308123'}]],
 {'category2': '1309183912309'},
 [{'subcategory': '10293182094'}]]
0 голосов
/ 14 ноября 2018

Вы можете использовать рекурсию с itertools.groupby:

s = """
category1 : 0120391123123
- subcategory : 0120391123123
-- subsubcategory : 019301948109
--- subsubsubcategory : 013904123908
---- subsubsubsubcategory : 019341823908
- subcategory2 : 0934810923801
-- subsubcategory2 : 09341829308123
category2: 1309183912309
- subcategory : 10293182094
"""

import re, itertools
data = list(filter(None, s.split('\n')))
def group_data(d):
  if len(d) == 1:
     return [dict([re.split('\s*:\s*', d[0])])]
  grouped = [[a, list(b)] for a, b in itertools.groupby(d, key=lambda x:not x.startswith('-'))]
  _group = [[grouped[i][-1], grouped[i+1][-1]] for i in range(0, len(grouped), 2)]
  _c = [[dict([re.split('\s*:\s*', i) for i in a]), group_data([c[1:] for c in b])] for a, b in _group]
  return [i for b in _c for i in b]


print(json.dumps(group_data(data), indent=4))

Вывод:

[
  {
    "category1": "0120391123123"
  },
  [
     {
        " subcategory": "0120391123123"
     },
     [
         {
            " subsubcategory": "019301948109"
         },
         [
             {
                " subsubsubcategory": "013904123908"
             },
             [
                 {
                    " subsubsubsubcategory": "019341823908"
                 }
             ]
         ]
     ],
     {
        " subcategory2": "0934810923801"
     },
     [
        {
            " subsubcategory2": "09341829308123"
        }
     ]
  ],
  {
    "category2": "1309183912309"
  },
  [
     {
        " subcategory": "10293182094"
     }
  ]
]

Примечание: этот ответ предполагает, что ваш окончательный вывод должен иметь "category2" находиться на том же уровне, что и "category1", так как оба не содержат "-" спереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...