2012-02-03 81 views
8

来自实例Using YAML with Python如何从纯python创建yaml文件?

原始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' 
       } 
       } 
      } 
+1

你问你如何保证获得相同的文件?如果是这样,则不能保证,因为字典没有预定义的顺序。 – Nate 2012-02-03 20:51:38

+0

@Nate对,这是我的意图。我明白那个。我编辑并提供了部分结构。 Yaml转储无法将内部{名称:节点1-1}转换为另一个级别...... – CppLearner 2012-02-03 21:02:18

回答

7

还好。我只是双重检查了文档。我们需要这种在yaml.dump(data, optional_args)

的修复,到底是该

yaml.dump(dataMap, f, default_flow_style=False) 

其中的数据图是源yaml.load()和f将被写入文件。

+0

该转储不会写入#tree格式的注释。 – Anthon 2015-07-01 03:19:11

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的增强版本,其中我是作者完成的。