当前位置: 首页 > 知识库问答 >
问题:

来自CSV的JSON树,id为parent(Python)

海翼
2023-03-14

我和这里有同样的问题。成功了。但为了完成,我需要一个稍微不同的输出:而不是只有

'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'}}

共有1个答案

陆飞捷
2023-03-14

我想这就是你想要的:

#!/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,我的输出应该是这样的: 当复制和插入文件夹时,文件表也将被更新,如下所示: 问题答案: