我希望遍历一个文件,并将每一行的内容放入一个深度嵌套的dict中,dict的结构由前导空格定义。这个愿望很像文档中的here。我已经解决了这个问题,但现在有一个问题,即重复键被覆盖而不是被强制转换到列表中。在
基本上:
a:
b: c
d: e
a:
b: c2
d: e2
d: wrench
当它应该被转换成
^{pr2}$一个独立的例子:
import json
def jsonify_indented_tree(tree):
#convert indentet text into json
parsedJson= {}
parentStack = [parsedJson]
for i, line in enumerate(tree):
data = get_key_value(line)
if data['key'] in parsedJson.keys(): #if parent key is repeated, then cast value as list entry
# stuff that doesn't work
# if isinstance(parsedJson[data['key']],list):
# parsedJson[data['key']].append(parsedJson[data['key']])
# else:
# parsedJson[data['key']]=[parsedJson[data['key']]]
print('Hey - Make a list now!')
if data['value']: #process child by adding it to its current parent
currentParent = parentStack[-1] #.getLastElement()
currentParent[data['key']] = data['value']
if i is not len(tree)-1:
#determine when to switch to next branch
level_dif = data['level']-get_key_value(tree[i+1])['level'] #peek next line level
if (level_dif > 0):
del parentStack[-level_dif:] #reached leaf, process next branch
else:
#group node, push it as the new parent and keep on processing.
currentParent = parentStack[-1] #.getLastElement()
currentParent[data['key']] = {}
newParent = currentParent[data['key']]
parentStack.append(newParent)
return parsedJson
def get_key_value(line):
key = line.split(":")[0].strip()
value = line.split(":")[1].strip()
level = len(line) - len(line.lstrip())
return {'key':key,'value':value,'level':level}
def pp_json(json_thing, sort=True, indents=4):
if type(json_thing) is str:
print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
else:
print(json.dumps(json_thing, sort_keys=sort, indent=indents))
return None
#nested_string=['a:', '\tb:\t\tc', '\td:\t\te', 'a:', '\tb:\t\tc2', '\td:\t\te2']
#nested_string=['w:','\tgeneral:\t\tcase','a:','\tb:\t\tc','\td:\t\te','a:','\tb:\t\tc2','\td:\t\te2']
nested_string=['a:',
'\tb:\t\tc',
'\td:\t\te',
'a:',
'\tb:\t\tc2',
'\td:\t\te2',
'\td:\t\twrench']
pp_json(jsonify_indented_tree(nested_string))
这种方法(逻辑上)更直接(虽然更长):
level
和key
-value
对level
键控的列表dict中: {{dict1
,dict2
]}level1
:[dict1
,dict2
,"nestKeyA"
]}dict1
,dict2
,"nestKeyA"
],level2
:[…]}。一些更深层次的内容{"nestKeyA"
],^{level3
:[……]})或一个新的口述{{level1
:[dict1
,dict2
,"nestKeyA"
],level2
:[dict3
]继续执行步骤1-4,直到当前行的缩进量小于上一行的缩进量(表示返回到以前的某个范围)。这就是我的示例中每行迭代的数据结构。在
那么有两件事需要发生。1:需要检查dict列表是否包含重复的键以及组合在列表中的任何重复dict值-这将在稍后演示。2:正如在迭代4和迭代5之间可以看到的,来自最深层的dict列表(这里
^{pr2}$1
)被组合成一个dict。。。最后,为了演示重复操作,请观察:其中
wrench
和e2
被放在一个列表中,这个列表本身进入一个由它们的原始密钥键控制的dict中。重复步骤1-5,将作用域更深的dict提升到其父键上,直到到达当前行的scope(level)。
代码如下:
相关问题 更多 >
编程相关推荐