Convert csv to JSON tree structure?

前端 未结 1 1126
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-09 14:25

I read these questions:

  • csv data to nested json tree in d3
  • Create a json tree from csv list in python
  • How to Create a JSON Tree from a Tabula
相关标签:
1条回答
  • 2020-12-09 14:34

    Using defaultdict from the collections standard library is making a lot of problems with hierarchical structures easy and solvable. So I've developed a sample solution for your problem. But before running the script, please, make sure you have comma separated csv file (named test.csv) or you can change the csv reader logic down there.

    Here's the csv file I've tested the script on.

    condition, target, sub, dub
    oxygen,tree,G1,T1
    oxygen,tree,G2,T1
    oxygen,tree,G2,T2
    water,car,G3,T1
    water,tree,GZ,T1
    water,tree,GZ,T2
    fire,car,GTD,T3
    oxygen,bomb,GYYS,T1
    

    Technically the script should work for any kind of csv file, with various dimensions. But you need to test it by yourself to be sure.

    import csv
    from collections import defaultdict
    
    
    def ctree():
        """ One of the python gems. Making possible to have dynamic tree structure.
    
        """
        return defaultdict(ctree)
    
    
    def build_leaf(name, leaf):
        """ Recursive function to build desired custom tree structure
    
        """
        res = {"name": name}
    
        # add children node if the leaf actually has any children
        if len(leaf.keys()) > 0:
            res["children"] = [build_leaf(k, v) for k, v in leaf.items()]
    
        return res
    
    
    def main():
        """ The main thread composed from two parts.
    
        First it's parsing the csv file and builds a tree hierarchy from it.
        Second it's recursively iterating over the tree and building custom
        json-like structure (via dict).
    
        And the last part is just printing the result.
    
        """
        tree = ctree()
        # NOTE: you need to have test.csv file as neighbor to this file
        with open('test.csv') as csvfile:
            reader = csv.reader(csvfile)
            for rid, row in enumerate(reader):
    
                # skipping first header row. remove this logic if your csv is
                # headerless
                if rid == 0:
                    continue
    
                # usage of python magic to construct dynamic tree structure and
                # basically grouping csv values under their parents
                leaf = tree[row[0]]
                for cid in range(1, len(row)):
                    leaf = leaf[row[cid]]
    
        # building a custom tree structure
        res = []
        for name, leaf in tree.items():
            res.append(build_leaf(name, leaf))
    
        # printing results into the terminal
        import json
        print(json.dumps(res))
    
    
    # so let's roll
    main()
    

    And here's the json segment from the result:

    {
        "name": "oxygen",
        "children": [
          {
            "name": "tree",
            "children": [
              {
                "name": "G2",
                "children": [
                  {
                    "name": "T2"
                  },
                  {
                    "name": "T1"
                  }
                ]
              },
              {
                "name": "G1",
                "children": [
                  {
                    "name": "T1"
                  }
                ]
              }
            ]
          },
          {
            "name": "bomb",
            "children": [
              {
                "name": "GYYS",
                "children": [
                  {
                    "name": "T1"
                  }
                ]
              }
            ]
          }
        ]
      }
    

    Please, let me know if you have any further questions and issues. Happy pythonning ;)

    0 讨论(0)
提交回复
热议问题