原始YAML文件包含此
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1
branch2:
name: Node 2
branch2-1:
name: Node 2-1
使用yaml.load()
从文件加载内容后,将其转储到新的YAML文件中,我得到了这个:
# tree format
treeroot:
branch1:
branch1-1: {name:Node 1-1}
name: Node 1
branch2:
branch2-1: {name: Node 2-1}
name: Node 2
直接从纯python构建YAML文件的正确方法是什么?我不想自己写字符串。我想建立字典和列表。
...偏
dataMap = {'treeroot':
{'branch2':
{'branch1-1':
{'name': 'Node 1-1'}, # should be its own level
'name': 'Node 1'
}
}
}
答案 0 :(得分:7)
还好。我只是仔细检查了文档。我们在yaml.dump(data, optional_args)
修复就是这个
yaml.dump(dataMap, f, default_flow_style=False)
其中dataMap是源yaml.load()
,f是要写入的文件。
答案 1 :(得分:1)
您的第一个和第二个列表是等效的,只是不同的表示法。
请参阅:http://en.wikipedia.org/wiki/YAML#Associative_arrays和http://pyyaml.org/wiki/PyYAMLDocumentation#Dictionarieswithoutnestedcollectionsarenotdumpedcorrectly
答案 2 :(得分:1)
假设您正在使用PyYAML,您显示的输出是不复制粘贴yaml.dump()
生成的内容,因为它包含注释,而PyYAML不会写那些。
如果要保留该注释,以及文件中的密钥排序(在将文件存储在版本控制系统中时很好),请使用¹:
import ruamel.yaml as yaml
yaml_str = """\
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1 # should be its own level
branch2:
name: Node 2
branch2-1:
name: Node 2-1
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4)
让你完全输入:
# tree format
treeroot:
branch1:
name: Node 1
branch1-1:
name: Node 1-1 # should be its own level
branch2:
name: Node 2
branch2-1:
name: Node 2-1
¹这是使用我作为作者的ruamel.yaml PyYAML的增强版本完成的。