将csv转换为JSON树结构吗? [英] Convert csv to JSON tree structure?
问题描述
我阅读了以下问题:
- 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 Tabulated Hierarchy in Python
- Python csv to nested JSON [closed]
但是,我仍然无法将csv文件转换为JSON的层次结构.我在stackoverflow上找到的脚本是特定于某个问题的.假设必须对三个变量进行分组:
However I'm still not able to convert a csv file to a hierarchy for JSON. Al the scripts I found on stackoverflow are specific for a certain problem. Let's say there are three variables which has to be grouped:
condition target sub
oxygen tree G1
oxygen tree G2
water car G3
water tree GZ
fire car GTD
oxygen bomb GYYS
这将导致这样的JSON文件(据我尝试):
This will result in a JSON file like this (as far as I tried):
oxygen
- tree
- G1
- G2
- bomb
-GYYS
water
- car
- G3
- tree
-GZ
fire
- car
- GTD
这些必须分组为嵌套结构,例如:
And these have to be grouped in a nested structure like:
{
"name": "oxygen",
"children": [
{
"name": "tree",
"children": [
{"name": "G1"},
{"name": "G2"},
{"name": "GYYS"}
]
},
{
"name": "bomb",
"children": [
{"name": "GYYS"}
]
}
]
}
etc.
我尝试了该站点上的每个脚本,但是我无法创建一个通用函数来生成flare.json这样的代码.我可以发布我的代码,但这就像上面提供的链接一样.因此,我要求一个简单的代码(或可以帮助我的示例)将其转换为类似flare.JSON的结构.
I tried every script on this site however I'm not able to make a generic function which can make a flare.json like that. I can post my code however this is just like the links provided above. So I'm asking for a simple code (or an example which can help me) to convert this to a flare.JSON like structure.
推荐答案
使用收藏标准库中的> defaultdict 层次结构容易解决的许多问题.因此,我为您的问题开发了一个示例解决方案.但是在运行脚本之前,请确保已用逗号分隔的csv文件(名为test.csv),或者可以更改
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.
这是我测试脚本的csv文件.
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
从技术上讲,该脚本应适用于具有各种尺寸的任何类型的csv文件.但是您需要自己进行测试才能确定.
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()
这是结果的json片段:
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"
}
]
}
]
}
]
}
请让我知道是否还有其他问题. 开心的pythonning;)
Please, let me know if you have any further questions and issues. Happy pythonning ;)
这篇关于将csv转换为JSON树结构吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!