文本格式,带有嵌套字典(Python)

时间:2018-12-09 08:56:40

标签: python dictionary recursion text nested

我想从具有id + parent层次结构的CSV制作JSON树。它可以工作,但我希望输出略有不同。 而不是仅仅返回:

Microsoft Word Add-In

我希望它返回:

'childs': { ........... }

或者只是:

'childs': { placeholder: 'Select', items: { ........... } }

这是我正在使用的代码:

'childs': { items: { ........... } }

我正在使用的data.csv是:

#!/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': {}", ""))

当前输出为:

@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

1 个答案:

答案 0 :(得分:0)

替换'childs': build_tree(d, id_)
使用'childs' : { 'placeholder': 'Select', 'items' : build_tree(d, id_) }
或使用'childs' : { 'items' : build_tree(d, id_) }

此外,您要替换掉空的子键print(final.replace(", 'childs': {}", ""))也是不好的。

{'val': 'lc' + id_, 'txt': name, 'childs': build_tree(d, id_)} 

是这样建造的:

obj = {'val': 'lc' + id_, 'txt': name}
childs = build_tree(d, id_)
if childs:
   obj['childs'] = childs

build_tree如下所示:

def build_tree(d, val):
    d = {}
    for id_, name in d[val]:
        obj = {'val': 'lc' + id_, 'txt': name}
        childs = build_tree(d, id_)
        if childs:
           obj['childs'] = childs
        d['lc' + id_] = obj
    return d