使用python从csv创建嵌套JSON时出现问题,列没有值

2024-10-02 18:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

提前谢谢你的帮助。 我有一个具有以下结构的csv文件:

group1,group2,group3,name,info
General,Nation,,Phil,info1
General,Nation,,Karen,info2
General,Municipality,,Bill,info3
General,Municipality,,Paul,info4
Specific,Province,,Patrick,info5
Specific,Province,,Maikel,info6
Specific,Province,Governance,Mike,info7
Specific,Province,Governance,Luke,info8
Specific,District,,Maria,info9
Specific,District,,David,info10

我需要一个嵌套的JSON用于D3或amcharts。 使用这个页面上的python脚本(https://github.com/hettmett/csv_to_json),我可以创建一个嵌套的JSON

结果如下所示:

[
   {
      "name" : "General",
      "children" : [
         {
            "name" : "Nation",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Phil",
                        "children" : [
                           {
                              "name" : "info1"
                           }
                        ]
                     },
                     {
                        "name" : "Karen",
                        "children" : [
                           {
                              "name" : "info2"
                           }
                        ]
                     }
                  ]
               }
            ]
         },
         {
            "name" : "Municipality",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Bill",
                        "children" : [
                           {
                              "name" : "info3"
                           }
                        ]
                     },
                     {
                        "name" : "Paul",
                        "children" : [
                           {
                              "name" : "info4"
                           }
                        ]
                     }
                  ]
               }
            ]
         }
      ]
   },
   {
      "name" : "Specific",
      "children" : [
         {
            "name" : "Province",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Patrick",
                        "children" : [
                           {
                              "name" : "info5"
                           }
                        ]
                     },
                     {
                        "name" : "Maikel",
                        "children" : [
                           {
                              "name" : "info6"
                           }
                        ]
                     }
                  ]
               },
               {
                  "name" : "Governance",
                  "children" : [
                     {
                        "name" : "Mike",
                        "children" : [
                           {
                              "name" : "info7"
                           }
                        ]
                     },
                     {
                        "name" : "Luke",
                        "children" : [
                           {
                              "name" : "info8"
                           }
                        ]
                     }
                  ]
               }
            ]
         },
         {
            "name" : "District",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Maria",
                        "children" : [
                           {
                              "name" : "info9"
                           }
                        ]
                     },
                     {
                        "name" : "David",
                        "children" : [
                           {
                              "name" : "info10"
                           }
                        ]
                     }
                  ]
               }
            ]
         }
      ]
   }
]

然而,这并不完全是我所需要的。问题是某些列没有值,因此反嵌套JSON中不应包含任何子级。 像这样:

"name": "Overview",
  "children": [{
      "name": "General", 
          "children": [
              { "name": "Nation",
                  "children": [
                      {"name": "Phil", "info": "info1"},
                      {"name": "Karen", "info": "info2"} 
                  ]
              },
              { "name": "Municipality",
                  "children": [
                      {"name": "Bill", "info": "info3"},
                      {"name": "Paul", "info": "info4"} 
                  ]        
              }
          ]


}, 
{
      "name": "Specific", 
          "children": [
              { "name": "Province",
                  "children": [
                      {"name": "Patrick", "info": "info5"},
                      {"name": "Maikel", "info": "info6"},
                      {"name": "Governance",
                          "children": [
                              {"name": "Mike", "info": "info7"},
                              {"name": "Luke", "info": "info8"}
                          ]
                      }
                  ]
              },
              { "name": "District",
                  "children": [
                      {"name": "Maria", "info": "info9"},
                      {"name": "David", "info": "info10"} 
                  ]        
              }
          ]
}
]

希望有人能帮忙

问候 斯特凡


Tags: nameinfogeneralchildrenbillprovincespecificdistrict
1条回答
网友
1楼 · 发布于 2024-10-02 18:17:39

您的“理想”结果与脚本给出的结果之间实际上存在两个有意义的差异:

  1. 删除空字符串(如您所述)
  2. 最后一个子项的格式为:{"name": "xxxxx", "info": "yyyyy"},而不是{"name": "xxxxx", "children": [{"name": "yyyyy"}]}

因此,我们可以解决这两个问题:

假设您已将js_objs定义为上述csv-to-json库的结果

from copy import deepcopy


def remove_empties(children):
    """Just removes the empty name string levels."""
    for i, js in enumerate(children):
        if js['name'] == '':
            children.pop(i)
            if 'children' in js:
                for child_js in js['children'][::-1]:
                    children.insert(i, child_js)
            if i < len(children):
                js = children[i]
            else:
                raise StopIteration('popped off a cap')
    for i, js in enumerate(children):
        if 'children' in js:
            js['children'] = remove_empties(js['children'])
    return children


def parse_last_child(js):
    """Looks for the last child and formats that one correctly"""
    if 'children' not in js:
        print(js)
        raise ValueError('malformed js')
    if len(js['children']) == 1 and 'children' not in js['children'][0]:
        js['info'] = js.pop('children')[0]['name']
    else:
        js['children'] = [parse_last_child(j) for j in js['children']]
    return js


accumulator = deepcopy(js_objs)  # so we can compare against the original
non_empties = remove_empties(accumulator)
results = [parse_last_child(x) for x in non_empties]

我得到的结果是

[{'name': 'General',
  'children': [{'name': 'Nation',
    'children': [{'name': 'Phil', 'info': 'info1'},
     {'name': 'Karen', 'info': 'info2'}]},
   {'name': 'Municipality',
    'children': [{'name': 'Bill', 'info': 'info3'},
     {'name': 'Paul', 'info': 'info4'}]}]},
 {'name': 'Specific',
  'children': [{'name': 'Province',
    'children': [{'name': 'Patrick', 'info': 'info5'},
     {'name': 'Maikel', 'info': 'info6'},
     {'name': 'Governance',
      'children': [{'name': 'Mike', 'info': 'info7'},
       {'name': 'Luke', 'info': 'info8'}]}]},
   {'name': 'District',
    'children': [{'name': 'Maria', 'info': 'info9'},
     {'name': 'David', 'info': 'info10'}]}]}]

注: 只要json对象不是太深,这就可以工作。否则,将达到递归深度

只是想澄清一下,在这种情况下:

js_objs = [
   {
      "name" : "General",
      "children" : [
         {
            "name" : "Nation",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Phil",
                        "children" : [
                           {
                              "name" : "info1"
                           }
                        ]
                     },
                     {
                        "name" : "Karen",
                        "children" : [
                           {
                              "name" : "info2"
                           }
                        ]
                     }
                  ]
               }
            ]
         },
         {
            "name" : "Municipality",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Bill",
                        "children" : [
                           {
                              "name" : "info3"
                           }
                        ]
                     },
                     {
                        "name" : "Paul",
                        "children" : [
                           {
                              "name" : "info4"
                           }
                        ]
                     }
                  ]
               }
            ]
         }
      ]
   },
   {
      "name" : "Specific",
      "children" : [
         {
            "name" : "Province",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Patrick",
                        "children" : [
                           {
                              "name" : "info5"
                           }
                        ]
                     },
                     {
                        "name" : "Maikel",
                        "children" : [
                           {
                              "name" : "info6"
                           }
                        ]
                     }
                  ]
               },
               {
                  "name" : "Governance",
                  "children" : [
                     {
                        "name" : "Mike",
                        "children" : [
                           {
                              "name" : "info7"
                           }
                        ]
                     },
                     {
                        "name" : "Luke",
                        "children" : [
                           {
                              "name" : "info8"
                           }
                        ]
                     }
                  ]
               }
            ]
         },
         {
            "name" : "District",
            "children" : [
               {
                  "name" : "",
                  "children" : [
                     {
                        "name" : "Maria",
                        "children" : [
                           {
                              "name" : "info9"
                           }
                        ]
                     },
                     {
                        "name" : "David",
                        "children" : [
                           {
                              "name" : "info10"
                           }
                        ]
                     }
                  ]
               }
            ]
         }
      ]
   }
]

相关问题 更多 >