2012-02-03 23 views
8

Using YAML with Python純粋なpythonからyamlファイルを作成するにはどうしたらいいですか?

オリジナルYAMLファイルがyaml.load()を使用してファイルからコンテンツをロードした後、この

# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 

が含まれており、新しい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

+0

@ネイトそうです、それが私の意図です。という事は承知しています。私は編集し、構造の一部を提供しました。 Yamlのダンプは内側の{name:Node 1-1}を別のレベルにすることはできません.... – CppLearner

答えて

7

大丈夫。私はドキュメンテーションをダブルチェックしました。私たちは、yaml.dump(data, optional_args)

修正プログラムがデータマップは、ソースyaml.load()、fはに書き込まれるファイルである。この

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

あるの終わりにこれを必要とします。

+0

このダンプは '#tree format'コメントを書きません。 – Anthon

1

http://pyyaml.org/wiki/PyYAMLDocumentation#Dictionarieswithoutnestedcollectionsarenotdumpedcorrectlyはあなたが表示され、出力はyaml.dump()が、それはコメントを含み、PyYAMLとがないようにして生成するもののないコピーペーストである、あなたはおそらくあるとして、あなたが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 

は、これは私が著者だそのPyYAMLとのruamel.yaml拡張バージョンを使用して行われたを¹しました。

関連する問題