将文本列表转为 json 格式的列表

我有一个格式如下的文本文件,每个连字符代表列表项的层次结构。


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"

         }

      ]

   ]

]


HUX布斯
浏览 201回答 2
2回答

慕标琳琳

您可以使用递归itertools.groupby:s = """category1 : 0120391123123- subcategory : 0120391123123-- subsubcategory : 019301948109--- subsubsubcategory : 013904123908---- subsubsubsubcategory : 019341823908- subcategory2 : 0934810923801-- subsubcategory2 : 09341829308123category2: 1309183912309- subcategory : 10293182094"""import re, itertoolsdata = 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",因为两者"-"的前面都不包含 a 。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python