用python查询yaml文件

2024-10-04 05:28:53 发布

您现在位置: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库,但如果可能的话,我更喜欢内置解决方案,但如果易于实现,也很受欢迎。提前感谢您的建议

附言: 我认为有这样一个查询是很优雅的:如果在每个python元组中都存在“dock”元素,那么将下一个元素附加到dock_list中,但我不确定如何实现它


Tags: 文件true元素yaml码头pyqtgraphsizesvertical
1条回答
网友
1楼 · 发布于 2024-10-04 05:28:53

您的结构似乎是节点,其中每个节点是verticalhorizontaldock。前两个有子项作为第二项,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']

相关问题 更多 >