首页 文章

使用嵌套字典(Python)进行文本格式化

提问于
浏览
-2

我想从具有id父层次结构的CSV创建JSON树 . 它工作但我希望输出略有不同 . 而不仅仅是返回:

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

我希望它返回:

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

要不就:

'childs': { 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': {}", ""))

我正在使用的data.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': {'childs': {},
                                                                'txt': 'Loures',
                                                                'val': 'lc5400843'},
                                                  'lc5400844': {'childs': {},
                                                                'txt': 'Mafra',
                                                                'val': 'lc5400844'}},
                                       'txt': 'Lisboa',
                                       'val': 'lc2897141'},
                         'lc3920249': {'childs': {},
                                       'txt': 'Aveiro',
                                       'val': 'lc3920249'},
                         'lc5011694': {'childs': {},
                                       'txt': 'Leiria',
                                       'val': 'lc5011694'}},
              'txt': 'Portugal',
              'val': 'lc295480'}}

1 回答

  • 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
    

相关问题