繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM