2016-05-31 3 views
3

Anstatt normale Zeilenumbrüche zu erhalten, würde ich erwarten, dass nur '\ n' gedruckt wird. Wie kann ich den Zeilenumbruch tatsächlich passieren lassen?Wie kann ich pyyaml ​​erhalten, um die Struktur in der Ausgabe korrekt anzuzeigen?

>>> test2 = [{'A':['a', 'b']}, {'B':'b'}] 
>>> yaml.dump(test2) 
'- A: [a, b]\n- {B: b}\n' 
>>> 
+3

Haben Sie versucht, 'print' zu verwenden? Strings in der interaktiven Eingabeaufforderung wie dieser zeigen niemals Zeilenumbrüche, Sie müssen sie "drucken". –

+0

Nein, ich bin ein Idiot. Vielen Dank. – Fallacy11

+0

Kein Problem. Ich postete als Antwort, Verstand akzeptiert? –

Antwort

2

dump() Die Routinen in PyYAML haben mehrere optionale Argumente, von denen die erste den Strom wobei die Daten werden (stream=) serialisiert werden.

Wenn Sie nicht diesen Strom angeben eine Datei wie Objekt wird erstellt (StringIO() oder BytesIO()), an dem die Daten serialisiert und in diesem Fall sind die die dump() Routine zurück, die getvalue() Objekte, wo es in der Regel nur None zurückgibt.

Da Sie keinen Ausgabestream angeben, weiß PyYAML nicht, wo die Ausgabe zu schreiben ist, und gibt das Ergebnis von getvalue() in Ihrem Fall als Zeichenfolge zurück. Wenn Sie den encoding= Parameter zur Verfügung gestellt hätten, würden Sie ein Bytearray auf Python 3 und nicht eine Zeichenkette erhalten.

Sie können natürlich print diese Zeichenfolge, aber das ist einer der häufigsten Fehler, die ich sehe Menschen mit PyYAML machen. Für eine kleine Datenstruktur ist dies entschuldbar, aber für große Datenstrukturen kann das Erstellen einer Zeichenfolgendarstellung im Speicher unnötig viel Speicher belegen.

Sie sollten für die Bereitstellung der Stromparameter auf die Gewohnheit gewöhnen: Sie

>>> import yaml 
>>> test2 = [{'A':['a', 'b']}, {'B':'b'}] 
>>> yaml.dump(test2) 
'- A: [a, b]\n- {B: b}\n' 
>>> import sys 
>>> yaml.dump(test2, stream=sys.stdout) 
- A: [a, b] 
- {B: b} 
>>> 

Dies auch davon ab, ein Doppel Newline am Ende des Ausgangs (einer aus der Serialisierung und einen von print) verhindert .

+0

Diese werden in ziemlich signifikante Strukturen (1000+ Zeilen) generiert werden, so ist dies eine viel bessere Antwort, danke für die Erklärung – Fallacy11

+0

@ Fallacy11 Ich verstehe nicht vollständig (ich bin nicht ein Muttersprachler), meinst du, dass du riesige Datenstrukturen haben wirst und daher die Speichernutzung signifikant wäre? – Anthon

+0

Ja, ich erstelle Ansible Playbooks mit verschiedenen Geräten, die verschiedene Anforderungen haben.Alle diese müssen in der YAML-Datei definiert werden, diese mehr als 1000 Zeilen werden im Laufe der Zeit erheblich wachsen, da ich verschiedene Umgebungen und Logik definieren muss (wenn der x-Umgebungstyp die y-Struktur verwendet), während ich Hintergrundüberwachungsaufgaben im Gleichzeitig ist die größere Ressourceneffizienz umso besser für mich. Wenn ich das direkt füttern kann, anstatt den Druck zu verwenden, um eine Datei zu erstellen (was ich sicher kann), wird dies viel effizienter. – Fallacy11

1

Sie können die Linie bekommen bricht mit print zu machen. Auf diese Weise in der interaktiven Eingabeaufforderung angezeigte Zeichenfolgen führen niemals zu Zeilenumbrüchen. Sie können erkennen, wie die Zeichenfolge in den Anführungszeichen() angezeigt wird, die um die Zeichenfolge herum angezeigt werden. Sie werden nicht mit print angezeigt.

>>> test2 = [{'A':['a', 'b']}, {'B':'b'}] 
>>> yaml.dump(test2) 
'- A: [a, b]\n- {B: b}\n' 
>>> print(yaml.dump(test2)) 
- A: [a, b] 
- {B: b} 

>>> 
+0

Warum die down vote? Meine Antwort ist korrekt ... –

Verwandte Themen