如果您关心键的顺序,并且还没有使用 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,
您应该完全删除包含 cmets 的属性。
这当然不能使用 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"