PyYAMLではこれを実行できません。 indent
オプションはマッピングにのみ影響し、シーケンスには影響しません。 PyYAMLはラウンドトリップ時のマッピングキーの順序も保持しません。
あなたは(dislaimer:私はそのパッケージの作者午前)ruamel.yamlを使用する場合は、出力とまったく同じ入力を得ることは簡単です:
import ruamel.yaml
yaml_str = """\
---
classes:
- apache # keep the indentation
- ntp
apache::first: 1
apache::package_ensure: present
apache::port: 999
apache::second: 2
apache::service_ensure: running
ntp::bla: bla
ntp::package_ensure: present
ntp::servers: '-'
"""
data = ruamel.yaml.round_trip_load(yaml_str)
res = ruamel.yaml.round_trip_dump(data, indent=4, block_seq_indent=2,
explicit_start=True)
assert res == yaml_str
それはまた、私が追加したコメントを保持することに注意してください最初の配列要素。
あなたが「ゼロ」からこれを構築するが、改行を追加すると、通話がruamel.yaml
に存在するためものではありませんすることができます
import ruamel.yaml
from ruamel.yaml.tokens import CommentToken
from ruamel.yaml.error import Mark
from ruamel.yaml.comments import CommentedMap, CommentedSeq
data = CommentedMap()
data['classes'] = classes = CommentedSeq()
classes.append('apache')
classes.append('ntp')
data['apache::first'] = 1
data['apache::package_ensure'] = 'present'
data['apache::port'] = 999
data['apache::second'] = 2
data['apache::service_ensure'] = 'running'
data['ntp::bla'] = 'bla'
data['ntp::package_ensure'] = 'present'
data['ntp::servers'] = '-'
m = Mark(None, None, None, 0, None, None)
data['classes'].ca.items[1] = [CommentToken('\n\n', m, None), None, None, None]
# ^1 is the last item in the list
data.ca.items['apache::service_ensure'] = [None, None, CommentToken('\n\n', m, None), None]
res = ruamel.yaml.round_trip_dump(data, indent=4, block_seq_indent=2,
explicit_start=True)
print(res, end='')
あなたは#
「なし(コメントとして改行を追加する必要があります')を改行の前の最後の要素、すなわち最後のリスト要素とapache::service_ensure
マッピングエントリに追加します。別にあなたは本当にYAML 1.2 2005年からYAML 1.1(ほとんどの)およびない最新のリビジョンいるのみサポート2009
ワードプレスのページにあなたからPyYAMLとを使用したい場合は、自分自身に問う必要があることから、
リンク先は非常に深刻ではないようです(パッケージ名はPyYAML
、正しい)。
明示的に 'file.close()'を呼び出すべきではありません。with文を終了すると例外が発生してもファイルが閉じられます。 – Anthon