Das ist in PyYAML nicht möglich. Die Option indent
betrifft nur Zuordnungen und keine Sequenzen. PyYAML bewahrt auch nicht die Reihenfolge der Zuordnungsschlüssel beim Runden.
Wenn Sie ruamel.yaml (Dislaimer: Ich bin der Autor dieses Pakets) verwenden, dann genau die gleiche Eingabe immer als Ausgang ist einfach:
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
Bitte beachten Sie, dass es auch den Kommentar bewahrt ich das addierte erstes Sequenzelement
Sie können dies von „scratch“ bauen, sondern eine neue Zeile hinzuzufügen, ist nicht etwas, für das ein Anruf in ruamel.yaml
existiert:
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='')
Sie die Newline als Kommentar muss hinzufügen (ohne '#
') bis zum letzten Element vor dem Zeilenumbruch, dh dem letzten Listenelement und dem Zuordnungseintrag apache::service_ensure
.
Abgesehen davon sollten Sie sich fragen, ob Sie wirklich wollen PyYAML verwenden, die nur unterstützt (die meisten) YAML 1.1 aus dem Jahr 2005 und nicht die neueste Version von YAML 1.2 aus dem Jahr 2009.
Die Wordpress-Seite verlinkt scheint nicht sehr ernst (es hat nicht einmal den Paketnamen, PyYAML
, richtig).
Sie sollten 'file.close()' nicht explizit aufrufen, das Beenden der with-Anweisung schließt die Datei für Sie (auch wenn eine Ausnahme auftritt) – Anthon