get comment during iteration in ruamel.yaml

匆匆过客 提交于 2020-12-13 04:28:41

问题


How can I get the comments when I iterate through the YAML object

yaml = YAML()

with open(path, 'r') as f:
    yaml_data = yaml.load(f)

for obj in yaml_data:
    # how to get the comments here?

This is the source data (an ansible playbook)

---
- name: gather all complex custom facts using the custom module
  hosts: switches
  gather_facts: False
  connection: local
  tasks:
    # There is a bug in ansible 2.4.1 which prevents it loading
    # playbook/group_vars
    - name: ensure we're running a known working version
      assert:
        that:
          - 'ansible_version.major == 2'
          - 'ansible_version.minor == 4'

After Anthon comments, this is the way I found to access the comments in the child nodes (needs to be refined):

for idx, obj in enumerate(yaml_data):
    for i, item in enumerate(obj.items()):
        pprint(yaml_data[i].ca.items)

回答1:


You did not specify your input, but since your code expects an obj and not a key, I assume the root level of your YAML is a sequence and not mapping. If you want to get the comments after each element (i.e nr 1 and the last) you can do:

import ruamel.yaml

yaml_str = """\
- one  # nr 1
- two 
- three # the last
"""

yaml = ruamel.yaml.YAML()

data = yaml.load(yaml_str)

for idx, obj in enumerate(data):
    comment_token = data.ca.items.get(idx)
    if comment_token is None:
        continue
    print(repr(comment_token[0].value))

which gives:

'# nr 1\n'
'# the last\n'

You might want to strip of the leading octothorpe and trailing newline.

Please note that this works with the current version (0.15.61), but there is no guarantee it might not to change.



来源:https://stackoverflow.com/questions/52043027/get-comment-during-iteration-in-ruamel-yaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!