80

私はyaml.dumpdictを出力するために使用しています。キーに基づいてアルファベット順に各項目を出力します。

>>> d = {"z":0,"y":0,"x":0}
>>> yaml.dump( d, default_flow_style=False )
'x: 0\ny: 0\nz: 0\n'

キーと値のペアの順序を制御する方法はありますか?

私の特定のユースケースでは、(偶然にも) 逆に印刷するだけで十分です。ただし、完全を期すために、順序をより正確に制御する方法を示す回答を探しています。

私は使用を見てきましたcollections.OrderedDictが、PyYAMLはそれをサポートしていないようです。subclassing も調べましたyaml.Dumperが、アイテムの順序を変更する機能があるかどうかはわかりませんでした。

4

9 に答える 9

2

これを希望どおりに取得するには、次の 2 つのことを行う必要があります。

  • dict注文されたアイテムを保持しないため、以外のものを使用する必要があります
  • その代替案を適切な方法でダンプする必要があります。¹

import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap

d = CommentedMap()
d['z'] = 0
d['y'] = 0
d['x'] = 0

ruamel.yaml.round_trip_dump(d, sys.stdout)

出力:

z: 0
y: 0
x: 0

¹これは、私が作成した YAML 1.2 パーサーであるruamel.yamlを使用して行われました。

于 2016-08-12T20:20:51.407 に答える
0

safe_dump(つまりdumpwith ) が使用されている場合Dumper=SafeDumper、呼び出しyaml.add_representerは効果がありません。このような場合、クラスadd_representerでメソッドを明示的に呼び出す必要があります。SafeRepresenter

yaml.representer.SafeRepresenter.add_representer(
    OrderedDict, ordered_dict_representer
)
于 2019-06-28T14:00:06.310 に答える
-1

次の設定は、コンテンツが出力でソートされないようにします。

yaml.sort_base_mapping_type_on_output = False
于 2020-06-11T08:10:32.410 に答える