9

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'
                 }
               }
          }
4

3 に答える 3

8

わかった。ドキュメントを再確認しました。最後にこれが必要ですyaml.dump(data, optional_args)

修正はこれです

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

ここで、dataMapはソースyaml.load()であり、fは書き込まれるファイルです。

于 2012-02-03T21:20:18.593 に答える
2

おそらく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

¹これは、私が作成者であるPyYAMLの拡張バージョンであるruamel.yamlを使用して行われました。

于 2015-07-01T03:17:48.053 に答える
1

最初のリストと2番目のリストは同等であり、表記が異なります。

参照: http: //en.wikipedia.org/wiki/YAML#Associative_arraysおよびhttp://pyyaml.org/wiki/PyYAMLDocumentation#Dictionarieswithoutnestedcollectionsarenotdumpedcorrectly

于 2012-02-03T21:26:33.143 に答える