我和这里有同样的问题。成功了。但为了完成,我需要一个稍微不同的输出:而不是只有
'childs': { ........... }
我想要:
'childs': { placeholder: 'Select', items: { ........... } }
以下是当前代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- import csv import re from collections import defaultdict from pprint import pprint parents = defaultdict(list) with open('data.csv',encoding="utf8") as csvfile: reader = csv.reader(csvfile, delimiter=',', quotechar='"') next(reader) count = 1 for row in reader: id_, name, admin_level, parent = row parents[parent].append((id_, name)) count += 1 def build_tree(d, val): return {'lc' + id_: {'val': 'lc' + id_, 'txt': name, 'childs': build_tree(d, id_)} for id_, name in d[val]} #pprint(build_tree(parents, '')) final = str(build_tree(parents, '')) print(final.replace(", 'childs': {}", ""))
使用的CSV是:
@id,name,admin_level,parent_id 295480,Portugal,2, 2897141,Lisboa,3,295480 3920249,Aveiro,3,295480 5011694,Leiria,3,295480 5400843,Loures,4,2897141 5400844,Mafra,4,2897141
目前的产出是:
{'lc295480': {'childs': {'lc2897141': {'childs': {'lc5400843': {'txt': 'Loures', 'val': 'lc5400843'}, 'lc5400844': {'txt': 'Mafra', 'val': 'lc5400844'}}, 'txt': 'Lisboa', 'val': 'lc2897141'}, 'lc3920249': {'txt': 'Aveiro', 'val': 'lc3920249'}, 'lc5011694': {'txt': 'Leiria', 'val': 'lc5011694'}}, 'txt': 'Portugal', 'val': 'lc295480'}}
我想这就是你想要的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# https://stackoverflow.com/questions/53687467/json-tree-from-csv-with-idparent-python
# Just: how to make that "return" give the 'childs': { placeholder: 'Select', items: { ........... } } in that form.
import csv
import re
from collections import defaultdict
from pprint import pprint
def find_branch(node, branch_key):
for key, item in node.items():
if key == branch_key:
return item
else:
child_node = find_branch(node[key]['children']['items'], branch_key)
if child_node:
return child_node
return None
tree = {}
with open('data.csv') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
next(reader)
for row in reader:
item_id, name, admin_level, parent_id = row
item_id = 'lc' + item_id
parent_id = 'lc' + parent_id if parent_id else None
if parent_id:
parent_branch = find_branch(tree, parent_id)
if parent_branch:
parent_branch['children']['items'][item_id] = dict(name=name, children=dict(placeholder='Select', items={}))
else:
print('Branch %s (%s) not found.' % (item_id, name))
# raise Exception('Branch %s (%s) not found.' % (id, name))
else:
tree[item_id] = dict(name=name, children=dict(placeholder='Select', items={}))
pprint(tree)
这将产生以下输出:
{'lc295480': {'children': {'items': {'lc2897141': {'children': {'items': {'lc5400843': {'children': {'items': {},
'placeholder': 'Select'},
'name': 'Loures'},
'lc5400844': {'children': {'items': {},
'placeholder': 'Select'},
'name': 'Mafra'}},
'placeholder': 'Select'},
'name': 'Lisboa'},
'lc3920249': {'children': {'items': {},
'placeholder': 'Select'},
'name': 'Aveiro'},
'lc5011694': {'children': {'items': {},
'placeholder': 'Select'},
'name': 'Leiria'}},
'placeholder': 'Select'},
'name': 'Portugal'}}
问题内容: 但是,我仍然无法将csv文件转换为JSON的层次结构。我在stackoverflow上找到的脚本是特定于某个问题的。假设必须对三个变量进行分组: 这将导致这样的JSON文件(据我尝试): 这些必须分组为嵌套结构,例如: 我尝试了该站点上的每个脚本,但是无法创建可以使flare.json这样的通用函数。我可以发布代码,但这就像上面提供的链接一样。因此,我要求一个简单的代码(或可以帮助我的
我写的是testdome https://www.testdome.com/for-developers/solve-question/9708中给出的一个测试示例的答案 问题是关于二叉搜索树的: 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 例如,对于以下树:n1(值:1,left:null,right:null)n2
我在映射时遇到一个问题: 马达。Java 查询“from motor”是一个classname。但它仍然不起作用。如何按id vnopol查询?
问题内容: 我有一个结构如下的JSON数据(这里可能存在一些错误,我使用的数据很好): 我想将其转换为csv,以便所选的属性名称成为csv标头,并且其值(仅深度1)成为数据。例如 我试过使用数百种 但没有一个成功。我得到的只是带有对象名称/类型的csv数据,我不知道如何使它仅使用json数据中每个对象的选定属性。 问题答案: 简而言之,您需要执行以下操作: 第一个问题是要传递不需要的行 。使用该开
问题内容: 有谁知道是否有可以让我将XLS最好转换为JSON的应用程序? 我还将为CSV转换程序做准备,因为如果周围什么都没有的话,我可能最终不得不写自己。 问题答案: 这对我来说效果很好,不需要上传文件: https://github.com/cparker15/csv-to- json?files=1
问题内容: 我有2张table: 现在我需要一个函数或光标或任何会得到两个输入的东西,即要复制的文件夹和要复制的目标文件夹,该函数应将文件夹及其子文件夹复制到具有新ID和父ID的同一表中,如下所示当复制并插入文件夹时,文件表中的文件也将被插入,请帮助我获得以下结果。 如果我将folder5对应到folder3,我的输出应该是这样的: 当复制和插入文件夹时,文件表也将被更新,如下所示: 问题答案: