2016-10-24 24 views
2

私はruamel.yamlを使ってPython辞書をYAMLファイルにダンプしようとしています。私は辞書をかなり-印刷するruamel.yamlruamel.yamlはsort_keysに相当しますか?

import json 
with open('outfile.json', 'w') as f: 
    json.dump(mydict, f, indent=4, sort_keys=True) 

のと同じくらい簡単です、私は限り

import ruamel.yaml 
with open('outfile.yaml', 'w') as f: 
    ruamel.yaml.round_trip_dump(mydict, f, indent=2) 

として得ているが、それはいないようですjsonモジュールのインターフェイスに精通していsort_keysオプションをサポートします。 ruamel.yamlでもdoesn't seem to have any exhaustive docsであり、Googleが「ruamel.yaml sort」または「ruamel.yaml alphabetize」を検索しても、私が期待しているシンプルさのレベルでは何も上がらなかった。

ソートされたキーでYAMLファイルをきれいに印刷するための1つまたは2つのライナーはありますか?

(再帰的に、私はキーが容器全体を下にアルファベット順にする必要があることに注意してください。。ただ、トップレベルをアルファベット順に並べことは十分ではありません)


私はround_trip_dumpを使用する場合、キーがあることに注意してくださいソートされていない。 safe_dumpを使用すると、出力は "YAMLスタイル"(またはもっと重要な "Kubernetesスタイル")YAMLではありません。私は出力に[]または{}を入れたくありません。

$ pip freeze | grep yaml 
ruamel.yaml==0.12.5 

$ python 
>>> import ruamel.yaml 
>>> mydict = {'a':1, 'b':[2,3,4], 'c':{'a':1,'b':2}} 
>>> print ruamel.yaml.round_trip_dump(mydict) # right format, wrong sorting 
a: 1 
c: 
    a: 1 
    b: 2 
b: 
- 2 
- 3 
- 4 

>>> print ruamel.yaml.safe_dump(mydict) # wrong format, right sorting 
a: 1 
b: [2, 3, 4] 
c: {a: 1, b: 2} 
+0

をあなたは私の答えの下部にsafe_dumpパラメータで見たことがありますか? – Anthon

答えて

1

この:

import sys 
import ruamel.yaml 

mydict = dict(a1=1, a2=2, a3=3, a11=11, a21=21) 
ruamel.yaml.round_trip_dump(mydict, sys.stdout) 

は非ソートされた出力を提供します。

a11: 11 
a2: 2 
a21: 21 
a3: 3 
a1: 1 

追加すること:これがソートされます

my_sorted_dict = ruamel.yaml.comments.CommentedMap() 
for k in sorted(mydict): 
    my_sorted_dict[k] = mydict[k] 
ruamel.yaml.round_trip_dump(my_sorted_dict, sys.stdout) 

:私のシステムでは

a1: 1 
a11: 11 
a2: 2 
a21: 21 
a3: 3 

はコメントマップは+往復(負荷を行うときruamel.yamlが使用する構造であり、ダンプ)、ラウンドトッピングは、キーを以前の順序で保持するように設計されています。あなたはYAMLファイルからmydictをロードし、わずか数キーを追加する必要がある場合は、あなたもmydictオーバー年代キーを歩くと挿入することができ

mydict.insert(pos, new_key, new_value))キーと値のペア。あなたは、他の特別な機能のいずれかの必要がない場合は、通常のsafe_dump()をすることによって、同じ出力を得ることができます。もちろん、

ruamel.yaml.safe_dump(mydict, sys.stdout, allow_unicode=True, 
         default_flow_style=False) 
+0

Oho、 '' Kubernetesスタイルの "YAML出力を有効にする適切な方法は' default_flow_style = False'ですか?私はそれを試すことがあります。 – Quuxplusone

+0

これは別の質問です。あなたが好きなら別に質問することができますが、今私は疑問に思っています。「デフォルトでソートキーを指定する良い方法はありますが、 'name'という名前のキーがあれば、それは全体の構造に再帰的に適用されますか?そのような方法があれば、私はそれを使用します。 – Quuxplusone

+0

@Quuxplusone最初に( 'name'、value)のペアを入れるか、指定したように' .insert() 'を使います。 'name'について知っている特定のシリアライザを書くこともできますが、PyYAMLが実装された方法(そしてルアメル。yamlはまだ続きます)、これはどのキーでもパラメータ化するのが難しいです(その答えには別個の質問が必要です)。 – Anthon

関連する問題