2012-02-03 763 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的增強版本,其中我是作者完成的。