如何删除ruamel.yaml中的评论?

时间:2019-08-21 19:47:22

标签: python ruamel.yaml

我真的很喜欢ruamel.yaml如何进行往返注释,但是我还没有弄清楚如何从YAML文件中删除注释。

#!/usr/bin/env python3
from ruamel.yaml import YAML
import sys

yaml = YAML()
yaml.preserve_quotes = True

with open(sys.argv[1], 'r') as f:
    object = yaml.load(f)
if sys.argv[2] == 'add':
    object['key'] = "value"
    object.yaml_add_eol_comment('Some comment', 'key')
if sys.argv[2] == 'remove':
    # This line does not work: This method does not exist.
    object.yaml_remove_eol_comment('key')


yaml.dump(object, open(sys.argv[1],'w'))

我尝试过的其他事情

object.yaml_add_eol_comment('','key') # String index error.
object.yaml_add_eol_comment(' ', 'key') # This creates a comment like `#  `.
object.yaml_add_eol_comment(None, 'key') # Error when trying to subscript it.
v = object['key']; del object['key']; object['key'] = v # The comment still sticks around.

2 个答案:

答案 0 :(得分:1)

在已加载的数据上没有方法形式的功能可以执行此操作,但是 您可以检查附加到已加载的集合的注释(映射或序列) 看起来像这样:

Comment(comment=None,
  items={'key': [None, None, CommentToken('# Some comment\n', line: 1, col: 11), None]})

也就是说,它包含一个字典,该字典包含(原始 关联)。您必须删除 条目,因为不这样做会使评论重新出现(当使用相同的 键)。

import sys
import ruamel.yaml

yaml_str = """\
a: 52
key: value # Some comment
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
# print(data.ca) # to see the comment attribute
del data.ca.items['key']
yaml.dump(data, sys.stdout)

给出:

a: 52
key: value

如果要删除所有评论,也可以

yaml.dump(dict(data), sys.stdout)

关于新加载的数据。

这也可以很容易地作为一种方法添加:

import sys
import ruamel.yaml

yaml_str = """\
a: 52
key: value # Some comment
"""

def my_yaml_remove_eol_comment(self, key):
    self.ca.items.pop(key, None)

ruamel.yaml.comments.CommentedMap.yaml_remove_eol_comment = my_yaml_remove_eol_comment


yaml = ruamel.yaml.YAML()

data = yaml.load(yaml_str)
data.yaml_remove_eol_comment('key')
yaml.dump(data, sys.stdout)

答案 1 :(得分:0)

很抱歉支持 Anthon 的回答,但我真的要强调他代码中的“隐藏”逻辑,这实际上允许在一行中轻松删除注释,而无需将任何内容脏注入模块:

object.ca.items.pop(key, None)

其中 key 是您要为其清除注释的实际键。就这样!