JSON дерево из CSV с id + parent (Python) - PullRequest
0 голосов
/ 09 декабря 2018

У меня была та же проблема, что и здесь .Это сработало.Но чтобы закончить, мне нужен немного другой вывод: вместо того, чтобы просто

'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 Ответ

0 голосов
/ 09 декабря 2018

Я думаю, это то, что вы хотите:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# /11953922/json-derevo-iz-csv-s-id-parent-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'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...