[英]How to delete all comments in ruamel.yaml?
默认情况下 ruamel.yaml 保留所有注释。 如何禁用此选项? 我想从一个 yaml 文件中删除所有评论,这些评论可以在任何地方。
目前我检查每个元素并设置yamldata.ca._items = {}
,但它并不总是有效。 有时它只是删除一行之前而不是之后的注释。 此外,它仅适用于第一级,并且要删除子图中的注释,我必须使用递归函数。
有什么简单的方法可以删除所有评论吗?
pyyaml 库不保留注释,但它也不允许配置缩进并且不保留顺序。 从文件中删除所有带有#
的行也会删除类似key: value # comment
。
如果您关心键的顺序,并且不再使用 Python 2(您不应该),那么您可以使用安全加载器加载然后使用(默认)往返转储程序转储:
import sys
import ruamel.yaml
yaml_str = """\
x: # first mapping
b: 1
a: 2
y:
- 3
- "4" # last_item
"""
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.preserve_quotes = True
yaml.default_flow_style = False
data = ruamel.yaml.YAML(typ='safe').load(yaml_str)
yaml.dump(data, sys.stdout)
这使:
x:
b: 1
a: 2
y:
- 3
- '4'
正如您所看到的, 4
周围的引号发生了变化。
如果这是不可接受的,您应该使用往返加载器加载,就像您所做的那样,而不是只删除评论属性items
,您应该完全删除包含评论的属性。
这当然不能使用ca
属性完成,您必须删除属性本身。 如果没有注释,您实际上在所有复杂节点上创建了一个空注释结构,这些节点在使用.ca
时没有一个。
def recursive_delete_comment_attribs(d):
if isinstance(d, dict):
for k, v in d.items():
recursive_delete_comment_attribs(k)
recursive_delete_comment_attribs(v)
elif isinstance(d, list):
for elem in d:
recursive_delete_comment_attribs(elem)
try:
# literal scalarstring might have comment associated with them
attr = 'comment' if isinstance(d, ruamel.yaml.scalarstring.ScalarString) \
else ruamel.yaml.comments.Comment.attrib
delattr(d, attr)
except AttributeError:
pass
data = yaml.load(yaml_str)
recursive_delete_comment_attribs(data)
yaml.dump(data, sys.stdout)
这使:
x:
b: 1
a: 2
y:
- 3
- "4"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.