Python 解析空间缩进数据
我有一些数据看起来像YAML,但不是。这是一个例子Python 解析空间缩进数据,python,parsing,Python,Parsing,我有一些数据看起来像YAML,但不是。这是一个例子 An instance of A objectID=123 family=abc An instance of A objectID=234 family=bcd List of 4 X elements: An instance of X: objectID=222 name=ccc An instance of X: objectID=333 等等 我需要找到一种方
An instance of A
objectID=123
family=abc
An instance of A
objectID=234
family=bcd
List of 4 X elements:
An instance of X:
objectID=222
name=ccc
An instance of X:
objectID=333
等等
我需要找到一种方法使它看起来更像这样:
[
{'name': 'An instance of A',
'data': [
{'objectID': 123,
'family': 'abc'
}
]
},
...
我试图创建一些递归函数来解析它,但结果却是一团糟
我并不要求提供一个完整的工作示例,但在python中实现这一点的最佳方法是什么?
自动调用功能?使用另一个库(我还没有找到)?使用另一种语言来帮助我并将整个内容嵌入python?使用堆栈,当您发现缩进的级别或多或少时,从中推送和弹出项目;堆栈上的每个级别都保存缩进深度和条目:
stack = [(0, {})] # indentation level, top-level entry
entry = stack[-1][1]
for line in input:
line = line.strip()
if not line: continue
indentation = len(input) - len(input.lstrip())
if indentation > stack[-1][0]: # indented further? New entry
entry = stack[-1][1]['data'] = {}
stack.append((indentation, entry)) # push
else:
while indentation < stack[-1][0]: # indentation dropped
del stack[-1] # pop
entry = stack[-1][1]
# process line and add to entry
result = stack[0][1]
stack=[(0,{})]#缩进级别,顶级条目
条目=堆栈[-1][1]
对于行输入:
line=line.strip()
如果不是第行:继续
缩进=len(输入)-len(输入.lstrip())
如果缩进>堆栈[-1][0]:#是否进一步缩进?新条目
entry=stack[-1][1][data']={}
stack.append((缩进,条目))#push
其他:
当缩进<堆栈[-1][0]:#缩进下降
del stack[-1]#pop
条目=堆栈[-1][1]
#处理行和添加到条目
结果=堆栈[0][1]
您可以尝试使用类似的库。当您到达以复合结尾的复合结尾时,这将失败:它只会从堆栈中弹出一个内容,而不是两个(或更多)内容。你需要像python那样做,保持一个缩进堆栈并弹出堆栈,直到达到以前使用的缩进(或者报告错误,或者如果以前没有使用新的缩进,尝试猜测它们的意思。)@rici:True,那么你需要在堆栈中包含缩进计数。将我的答案更新为这样做,然后弹出,直到缩进级别再次匹配。