2017-10-13 19 views
0

私はyamlパーサー(PyYamlを使用)が元の状態であったのでYAMLを保存していない理由を調べようとしています。python yamlパッケージ不要なときに新しい行を解析する

YAMLの元の行は次のとおりです。

healthcheck: 
    test: ["CMD-SHELL", "[ x\"`curl -k --silent -w '%{http_code}' https://localhost:4433 | grep 401`\" = x\"\" ] && exit 1 || exit 0"]  
    interval: 30s 

しかし、新しい行(単にファイルをロードし、再びそれを保存): 1):

healthcheck: 
     interval: 30s 
     test: 
     - CMD-SHELL 
     - '[ x"`curl -k --silent -w ''%{http_code}'' https://localhost:4433 | grep 401`" 
     = x"" ] && exit 1 || exit 0' 

ここでは2つの問題があります。 "test"値は1行のキー値の対ではなくリストになります。 2)実際には3 新しい行ここにあります、

a) -CMD-SHELL 
b)- '[ x"`curl -k --silent -w ''%{http_code}'' https://localhost:4433 | grep 401`" 
c)= x"" ] && exit 1 || exit 0' 

ので、他の質問は、なぜ三行目2行目から壊れていたのですか? (空白を表示すると、2行目の最後にLF があり、3行目が始まることがわかります)

答えて

1

私はあなたがYAML構文に関するいくつかの誤解を持っているかもしれないと思います。この:

test: ["this", "is", "a", "list"] 

このとまったく同じです:

test: 
    - this 
    - is 
    - a 
    - list 

そして、この:私はにあなたの一例をドロップすると

- "This is a 
    string value" 

- "This is a string value" 

はとまったく同じですファイルdata.yml

$ cat data.yml 
healthcheck: 
    test: ["CMD-SHELL", "[ x\"`curl -k --silent -w '%{http_code}' https://localhost:4433 | grep 401`\" = x\"\" ] && exit 1 || exit 0"] 
    interval: 30s 

そしてPyYAMLとしてそれを解析:

>>> import yaml 
>>> with open('data.yml') as fd: 
... data = yaml.load(fd) 
... 

私は、次のPythonのデータ構造を取得:

>>> pprint.pprint(data) 
{'healthcheck': {'interval': '30s', 
       'test': ['CMD-SHELL', 
          '[ x"`curl -k --silent -w \'%{http_code}\' https://localhost:4433 | grep 401`" = x"" ] && exit 1 || exit 0']}} 

そして私はPyYAMLとを使用して、私が得ることをダンプする場合:

>>> print yaml.dump(data) 
healthcheck: 
    interval: 30s 
    test: [CMD-SHELL, '[ x"`curl -k --silent -w ''%{http_code}'' https://localhost:4433 
     | grep 401`" = x"" ] && exit 1 || exit 0'] 

...これはちょっといいですね。

>>> print yaml.dump(data, default_flow_style=False) 
healthcheck: 
    interval: 30s 
    test: 
    - CMD-SHELL 
    - '[ x"`curl -k --silent -w ''%{http_code}'' https://localhost:4433 | grep 401`" 
    = x"" ] && exit 1 || exit 0' 

...元の文書とまったく同じPythonのデータ構造を解析します:私は、私はあなたがあなたの例で示したものを得る。その場合には、より詳細なリスト構文を、要求することができます。 「見た目が違う」以外は、実際のデータは同じです。

0

PyYAMLは往復でスタイルを保持するのにあまり良くありません)、ロード/ダンプパラメータを使用して入力をそのまま保存することはできません。そのためには、PyYAMLパーサーを変更する必要があります。

これはruamel.yamlで行われていることです(免責事項:パッケージ)は、そのようなプログラムによるラウンドトリップ(コメントの保存を含む)をサポートするために特別に開発されたものです:コメントの保存を含めて:

out.yamlと全く同じ内容のtest.yamlが表示されます。

デフォルトの幅(80)は、PyYAMLと同じように行を折り返します。そのため、最大長の行よりも長い行に設定します。 preserve_quotesが必要な場合は、"CMD-SHELL"の余分な引用符が削除されます。あなたはまだPythonの2を実行する場合

上記は、あなたが適切に開かれた通常のファイルハンドルに渡すことができ、(pathlib用)のPython 3を前提としています

with open('test.yaml') as fp: 
    data = yaml.load(fp) 
with open('out.yaml', 'w') as fp: 
    yaml.dump(data, fp) 
関連する問題