![](/img/trans.png)
[英]How to insert a comment line to YAML in Python using ruamel.yaml?
[英]How do you remove a comment in 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.
加载数据的方法形式没有功能可以做到这一点,但您可以检查附加到加载集合(映射或序列)的注释,这将如下所示:
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)
很抱歉支持 Anthon 的回答,但我真的要强调他代码中的“隐藏”逻辑,它实际上允许在一行中轻松删除注释,而无需将任何内容注入模块:
object.ca.items.pop(key, None)
其中key
是您要为其清除注释的实际键。 就是这样!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.