Python到父/子JSON

Python到父/子JSON,python,json,csv,Python,Json,Csv,我尝试使用Python将CSV数据转换为JSON,格式如下: 这样我可以修改一些例子 我找到了一些关于如何进行类似转换的帖子,但与嵌套的{'name':name,'children'=[]}格式完全不同 对于test.csv: Team,Task,Country,ID Team A,Processing,CA,5 Team A,Review,CA,45 Team B,Processing,US,76 Team B,Processing,CA,676 Team B,Support,US,2345

我尝试使用Python将CSV数据转换为JSON,格式如下: 这样我可以修改一些例子

我找到了一些关于如何进行类似转换的帖子,但与嵌套的
{'name':name,'children'=[]}
格式完全不同

对于test.csv:

Team,Task,Country,ID
Team A,Processing,CA,5
Team A,Review,CA,45
Team B,Processing,US,76
Team B,Processing,CA,676
Team B,Support,US,2345
Team C,Processing,US,67
Team C,Review,US,734
Team C,Support,US,34
输出应如下所示:

{
 "name": "Flare",
 "children": [
  {
   "name": "Team A",
   "children": [
    {
     "name": "Processing",
     "children": [
      {"name": "CA", "size": 5}
     ]
    },
    {
     "name": "Review",
     "children": [
      {"name": "CA", "size": 45}
     ]
    }
   ]
  },
  {
   "name": "Team B",
   "children": [
    {
     "name": "Processing",
     "children": [
      {"name": "US", "size": 76},
      {"name": "CA", "size": 676}
     ]
    },
    {
     "name": "Support",
     "children": [
      {"name": "US", "size": 2345}
     ]
    }
   ]
  }, 
  {
   "name": "Team C",
   "children": [
    {
     "name": "Processing",
     "children": [
      {"name": "US", "size": 67}
     ]
    },
    {
     "name": "Review",
     "children": [
      {"name": "US", "size": 734}
     ]
    },
    {
     "name": "Support",
     "children": [
      {"name": "US", "size": 34}
     ]
    }
   ]
  }
 ]
}
这是我所能做到的(我知道这很糟糕):

这将产生:

{
 "name": "flare", 
 "children": [
  {
   "name": "Team A", 
   "children": [
    [
     "Review", 
     "CA", 
     "45"
    ]
   ]
  }, 
  {
   "name": "Team B", 
   "children": [
    [
     "Processing", 
     "CA", 
     "676"
    ], 
    [
     "Support", 
     "US", 
     "2345"
    ]
   ]
  }
 ]
}

这看起来是朝着正确的方向发展,但即使我能够嵌套第一个级别,我也不确定如何以通用方式嵌套更多级别。

填充树是最清晰的解决方案。然而,使用dict进行遍历并不是一个好主意。我建议为每个树节点创建一个helper类,使用它填充数据,然后将结果转换为JSON:

import csv
import json


class Node(object):
    def __init__(self, name, size=None):
        self.name = name
        self.children = []
        self.size = size

    def child(self, cname, size=None):
        child_found = [c for c in self.children if c.name == cname]
        if not child_found:
            _child = Node(cname, size)
            self.children.append(_child)
        else:
            _child = child_found[0]
        return _child

    def as_dict(self):
        res = {'name': self.name}
        if self.size is None:
            res['children'] = [c.as_dict() for c in self.children]
        else:
            res['size'] = self.size
        return res


root = Node('Flare')

with open('/tmp/test.csv', 'r') as f:
    reader = csv.reader(f)
    reader.next()
    for row in reader:
        grp1, grp2, grp3, size = row
        root.child(grp1).child(grp2).child(grp3, size)

print json.dumps(root.as_dict(), indent=4)

请您发布预期输出,例如
test.csv
文件应该是什么样子的?更新了上面的预期输出这正是我想要的!节省了我很多时间!惊人的解决方案!谢谢你@Marcin Magnus我面临同样的问题,我得到了错误grp1,grp2,grp3,size=行值错误:没有足够的值来解包(预期为4,得到2)。我该如何解决这个问题?请你帮我解决这个问题。我需要来自JSON的csv
import csv
import json


class Node(object):
    def __init__(self, name, size=None):
        self.name = name
        self.children = []
        self.size = size

    def child(self, cname, size=None):
        child_found = [c for c in self.children if c.name == cname]
        if not child_found:
            _child = Node(cname, size)
            self.children.append(_child)
        else:
            _child = child_found[0]
        return _child

    def as_dict(self):
        res = {'name': self.name}
        if self.size is None:
            res['children'] = [c.as_dict() for c in self.children]
        else:
            res['size'] = self.size
        return res


root = Node('Flare')

with open('/tmp/test.csv', 'r') as f:
    reader = csv.reader(f)
    reader.next()
    for row in reader:
        grp1, grp2, grp3, size = row
        root.child(grp1).child(grp2).child(grp3, size)

print json.dumps(root.as_dict(), indent=4)