使用 python 查询 yaml 文件
Query yaml file with python
我有一个 yaml 文件,它是由 pyqtgraph 库生成的,用于排列码头,如下所示:
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_list
但我不确定如何实现它.
您的结构似乎是节点,其中每个节点是 vertical
、horizontal
或 dock
。前两个将 children 作为第二项,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']
我有一个 yaml 文件,它是由 pyqtgraph 库生成的,用于排列码头,如下所示:
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_list
但我不确定如何实现它.
您的结构似乎是节点,其中每个节点是 vertical
、horizontal
或 dock
。前两个将 children 作为第二项,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']