如何用Python将含父级列的CSV转换为层级JSON?
当然有简便的实现方法!针对你的需求,我推荐两种常用方案——一种适合离线批量转换,另一种完美适配D3前端场景,都能轻松生成你要的树形JSON结构:
方案1:Python脚本处理(适合离线转换)
如果需要提前把CSV转成JSON文件,用Python+Pandas可以快速搞定,代码逻辑清晰,处理大量数据也很高效:
首先确保安装了Pandas:
pip install pandas
然后运行下面的脚本:
import pandas as pd import json def build_tree(df, parent_id=None): # 筛选当前父节点的所有子节点 children = df[df['ParentBrandID'] == parent_id].to_dict('records') for child in children: # 递归查找子节点的子级 child_children = build_tree(df, child['BrandID']) if child_children: child['children'] = child_children # 调整字段格式,只保留需要的name字段 child['name'] = child.pop('Name') del child['BrandID'] del child['ParentBrandID'] return children # 读取CSV,处理空值(根节点的ParentBrandID设为None) df = pd.read_csv('data.csv', dtype={'ParentBrandID': float}) df['ParentBrandID'] = df['ParentBrandID'].where(pd.notnull(df['ParentBrandID']), None) # 构建树形结构(单根节点取第一个结果) tree = build_tree(df)[0] # 保存为JSON文件 with open('tree.json', 'w', encoding='utf-8') as f: json.dump(tree, f, indent=2, ensure_ascii=False)
运行后会生成和你示例完全一致的tree.json,如果CSV有多根节点,只需要把tree = build_tree(df)[0]改成tree = build_tree(df),再循环保存成多个JSON文件即可。
方案2:前端用D3.js直接处理(适合动态加载)
如果你的数据需要在前端动态加载并直接用于D3可视化,那用D3自带的d3.stratify()方法最方便——这是D3专门为父子结构数据设计的工具,一步就能生成树形结构:
d3.csv('data.csv').then(data => { // 配置层级转换规则 const stratify = d3.stratify() .id(d => d.BrandID) // 指定节点ID字段 .parentId(d => d.ParentBrandID || null); // 指定父ID字段,空值转为null // 生成层级结构并调整字段格式 const root = stratify(data) .each(d => { d.name = d.data.Name; // 移除不需要的冗余属性 delete d.id; delete d.parentId; delete d.data; }); // 输出JSON字符串(如果需要导出文件) const treeJson = JSON.stringify(root, null, 2); console.log(treeJson); // 直接用root对象喂给D3树形布局,比如: // const treeLayout = d3.tree().size([width, height]); // treeLayout(root); });
这个方法不需要额外转换文件,加载CSV后直接生成D3能直接使用的树形结构,完全贴合你的需求。
注意事项
- 确保CSV里的
ParentBrandID空值是真正的空单元格,不是字符串"null"或"NaN",如果是字符串格式,需要在代码里额外做转换。 - 多根节点场景下,两种方案都会返回根节点数组,只需循环处理即可。
内容的提问来源于stack exchange,提问作者Mario Antonio Alvarez Enriquez
相关产品推荐
相关产品推荐

