用python查询yaml文件



我有一个由pyqtgraph库生成的用于安排码头的yaml文件,如下所示:

float: []
main: !!python/tuple
- vertical
- - !!python/tuple
- vertical
- - !!python/tuple
- horizontal
- - !!python/tuple
- dock
- NameOfDock1
- true
- !!python/tuple
- dock
- NameOfDock2
- true
- !!python/tuple
- dock
- NameOfDock3
- true
- !!python/tuple
- dock
- NameOfDock4
- true
- !!python/tuple
- dock
- NameOfDock5
- true
- sizes:
- 174
- 174
- 433
- 388
- 401
- !!python/tuple
- horizontal
- - !!python/tuple
- dock
- NameOfDock6
- true
- !!python/tuple
- dock
- NameOfDock7
- true
- sizes:
- 397
- 1185
- sizes:
- 313
- 93
- !!python/tuple
- horizontal
- - !!python/tuple
- dock
- NameOfDock8
- true
- !!python/tuple
- dock
- NameOfDock9
- true
- sizes:
- 791
- 791
- !!python/tuple
- horizontal
- - !!python/tuple
- dock
- NameOfDock10
- true
- !!python/tuple
- dock
- NameOfDock11
- true
- sizes:
- 1318
- 264
- sizes:
- 410
- 80
- 80

是否有一种优雅的方法来查询这种yaml文件以获得码头([NameOfDock1, NameOfDock2, NameOfDock3, NameOfDock4, ...])的所有名称的列表?我听说过yaql库,但如果可能的话,我更喜欢一个内置的解决方案,但如果容易实现,也很受欢迎。提前感谢您的建议!

PS:我认为有这样一个查询会很优雅:如果在每个python元组中都存在"dock";元素,而不是附加下一个元素到dock_list,但我不确定如何实现它。

您的结构似乎是节点,每个节点是vertical,horizontaldock。前两个有子条目作为第二个条目,dock有一个名称。因此,获取所有码头名称的最简单方法是折叠:

# get_docks returns a list of dock names in the given node
def get_docks(data):
# if it's a dock node, return a list with the dock's name as single item
return [ data[1] ] if data[0] == "dock" else [
dock for item in data[1] for dock in get_docks(item) ]
# if not, call get_docks on each list item in the node's children and
# accumulate the dock names in a single list
print(get_docks(config))

这将给你

['NameOfDock1', 'NameOfDock2', 'NameOfDock3', 'NameOfDock4', 'NameOfDock5', 'NameOfDock6', 'NameOfDock7', 'NameOfDock8', 'NameOfDock9', 'NameOfDock10', 'NameOfDock11']

最新更新