web-dev-qa-db-ja.com

pyyamlでかなり出力

私はpythonプロジェクトでYAML(pyYaml 3.11)を使用したいのですが、特に「きれい」で、必要に応じてユーザーがテキストエディターで簡単に編集できるためです。しかし、問題は、YAMLをpythonアプリケーション(必要に応じて)に取り込み、内容を編集(必要に応じて)した場合、通常、新しいドキュメントの記述は完全ではありません。私が始めたのと同じくらいかわいい。

Pyyamlのドキュメントはかなり貧弱です-ダンプ関数へのパラメータもドキュメント化していません。私は http://dpinte.wordpress.com/2008/10/31/pyaml-dump-option/ を見つけました。ただし、必要な情報がまだ不足しています。 (私はソースを調べ始めましたが、それは最も魅力的ではないようです。ここで解決策を得られない場合は、それが私の唯一の手段です。)

まず、次のようなドキュメントから始めます。

-カラーグリーン:
入力:
-ポートシング:
ウィジェットヒント:ファイル名
ウィジェットヘルプ:ファイル名を選択
-ポートtarget_path:
ウィジェットヒント:パス
値: 'thing' 
出力:
-ポート値:
ウィジェットヒント:string 
 text:| 
道に迷って見つけた
と私はオオカミのように空腹です。

python(yaml.safe_load(s)))にロードした後、いくつかの方法でダンプします。

 >>> print yaml.dump(d3、default_flow_style = False、default_style = '')
-color green:
入力:
-ポートの事柄:
ウィジェットヘルプ:ファイル名を選択
ウィジェットヒント:ファイル名
-ポートtarget_path:
値:モノ
ウィジェットヒント:パス
出力:
-ポート値:
ウィジェットヒント:文字列
テキスト: '私は失われ、見つけられました
 
そして私はオオカミのように空腹です。
 
 '
 >>> print yaml.dump(d3、default_flow_style = False、default_style = '|')
-"color green":
 "inputs":
 -"ポートシング":
 "ウィジェットヘルプ":|-
ファイル名を選択
 "ウィジェットヒント":|-
ファイル名
-"port target_path":
 "value":|-
 thing 
 "widget-hint":|-
 path 
 "出力":
-" port value ":
" widget-hint ":|-
 string 
" text ":| 
私は失われ、私は見つかった
そして私はオオカミのように空腹です。
 

理想的には、最初の結果のように、 "短い文字列"には引用符を使用しないでください。しかし、2番目の結果のように、複数行の文字列をブロックとして記述したいと思います。基本的には、ファイル内の不要な引用の爆発を最小限に抑えようとしているので、テキストエディタで編集するのはずっと面倒です。

誰かこれについて何か経験がありますか?

13
Mayur Patel

ruamel.yaml を使用できる場合(免責事項:私はこの拡張バージョンのPyYAMLの作成者です)、次のことができます。

import ruamel.yaml

yaml_str = """\
- color green :
     inputs :
        - port thing :
            widget-hint : filename
            widget-help : Select a filename
        - port target_path :
            widget-hint : path
            value : 'thing'
     outputs:
        - port value:
             widget-hint : string
     text : |
            I'm lost and I'm found
            and I'm hungry like the wolf.
"""

data = ruamel.yaml.round_trip_load(yaml_str)
res = ""
for line in ruamel.yaml.round_trip_dump(data, indent=5, block_seq_indent=3).splitlines(True):
    res += line[3:]
print(res)

あなたが得る:

- color green:
       inputs:
          - port thing:
                 widget-hint: filename
                 widget-help: Select a filename
          - port target_path:
                 widget-hint: path
                 value: thing
       outputs:
          - port value:
                 widget-hint: string
       text: |
            I'm lost and I'm found
            and I'm hungry like the wolf.

あなたが最初に何をしたのかは正確ではありません(しかし、この往復の後は安定しています)。 ruamel.yamlの最新バージョンでは、インデント内のシーケンス-のインデントと相対インデントの両方を設定できます。ただし、後者はトップレベルのシーケンス、つまり後処理にも影響します。

保存される重要な(私にとって)事柄:コメント、アンカー、マッピングのマージ、およびリテラルスカラー(|を使用した複数行)

9
Anthon

pyaml prettyプリンターを試してください。スペースが含まれている短い文字列を引用符で囲みますが、近づきます。

>>> print pyaml.dump(d3)
- 'color green':
    inputs:
      - 'port thing':
          widget-help: 'Select a filename'
          widget-hint: filename
      - 'port target_path':
          value: thing
          widget-hint: path
    outputs:
      - 'port value':
          widget-hint: string
    text: |
      I'm lost and I'm found
      and I'm hungry like the wolf.
10