8

Ruamel を使用して、人間が編集した YAML ファイルに引用スタイルを保存しています。

次のような入力データの例があります。

---
a: '1'
b: "2"
c: 3

私は以下を使用してデータを読み込みました:

def read_file(f):
    with open(f, 'r') as _f:
        return ruamel.yaml.round_trip_load(_f.read(), preserve_quotes=True)

次に、そのデータを編集します。

data = read_file('in.yaml')
data['foo'] = 'bar'

次を使用してディスクに書き戻します。

def write_file(f, data):
    with open(f, 'w') as _f:
        _f.write(ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper, width=1024))

write_file('out.yaml', data)

出力ファイルは次のとおりです。

a: '1'
b: "2"
c: 3
foo: bar

ファイルの残りの部分全体でその引用スタイルを強制することなく、文字列 'bar' のハード クォートを強制する方法はありますか?

(また、3 つのダッシュを削除しないようにすることはでき---ますか?)

4

2 に答える 2

13

文字列スカラーの引用符 (およびリテラル ブロック スタイル) を保持するために、ruamel.yaml¹ は、ラウンドトリップ モードで、これらのスカラーを SingleQuotedScalarStringDoubleQuotedScalarStringおよびとして表しますPreservedScalarString。これらの非常に薄いラッパーのクラス定義は、scalarstring.py. そのようなインスタンスをシリアライズすると、「読み取られたとおりに」書き込まれますが、困難になると、リプレゼンテーションは任意の文字列を表すことができるため、二重引用符にフォールバックすることがあります。

新しいキーと値のペアを追加するとき (または既存のペアを更新するとき) にこの動作を取得するには、これらのインスタンスを自分で作成する必要があります。

import sys
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString, DoubleQuotedScalarString

yaml_str = """\
---
a: '1'
b: "2"
c: 3
"""

yaml = YAML()
yaml.preserve_quotes = True
yaml.explicit_start = True
data = yaml.load(yaml_str)
data['foo'] = SingleQuotedScalarString('bar')
data.yaml_add_eol_comment('# <- single quotes added', 'foo', column=20)
yaml.dump(data, sys.stdout)

与えます:

---
a: '1'
b: "2"
c: 3
foo: 'bar'          # <- single quotes added

yaml.explicit_start = True(余分な) ドキュメント開始マーカーを再作成します。そのようなマーカーが元のファイルにあったかどうかは、最上位の辞書オブジェクトによって「認識」されていないため、手動で追加する必要があります。

がないとpreserve_quotes、値が(単一の)引用符で囲まれ、整数としてではなく文字列スカラーとして表示されることに注意してください。12


¹私はその著者です。

于 2016-09-01T05:20:26.687 に答える
5

Ruamel 0.15 以降、preserve_quotes フラグを次のように設定します。

from ruamel.yaml import YAML
from pathlib import Path

yaml = YAML(typ='rt') # Round trip loading and dumping
yaml.preserve_quotes = True
data = yaml.load(Path("in.yaml"))
yaml.dump(data, Path("out.yaml"))
于 2017-10-13T10:20:50.067 に答える