2016-05-31 9 views
3

通常の改行を得るのではなく、単に '\ n'を印刷するだけです。どのようにして実際に改行を行うことができますか?pyyamlに出力の構造を正しく表示させるにはどうすればよいですか?

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

'print'を使ってみましたか?このようなインタラクティブなプロンプトの文字列は改行を表示しないので、 'print'する必要があります。 –

+0

いいえ、私はばかです。ありがとうございました。 – Fallacy11

+0

問題ありません。私は答えとして投稿しました。 –

答えて

2

dump()ルーチンは、いくつかのオプションの引数、データ(stream=)にシリアル化されるストリームされた第1を有しています。

あなたはデータが、それは通常ちょうどNoneを返しgetvalue()を、オブジェクトdump()戻っシリアル化され、その場合にはされているオブジェクトのようなファイルが作成されます。このストリーム(StringIO()またはBytesIO())を指定しない場合。

出力ストリームを指定しないので、PyYAMLは出力の書き込み先を知らず、getvalue()の結果を文字列としてケースに返します。 encoding=パラメータを指定した場合、Python 3では文字列ではなくバイト配列が取得されます。

もちろん、printその文字列は、PyYAMLを使用している人が見る最もよくある間違いの1つです。小さなデータ構造の場合、これは容認できますが、大きなデータ構造の場合、メモリ内に文字列表現を作成すると、不必要に大量のメモリを消費する可能性があります。

あなたは、ストリームのパラメータを提供するのが習慣に慣れる必要があります。

>>> 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} 
>>> 

また、これは出力の最後(直列化から1、およびprintから1)に二重改行を得ることからあなたを防ぎます。

+0

これは非常に重要な構造(1000 +ライン)に生成されるので、これははるかに良い答えです、説明をありがとうございます – Fallacy11

+0

@ Fallacy11私は完全に理解していませんネイティブスピーカー)、あなたは巨大なデータ構造を持つことになるので、メモリ使用量が重要になるでしょうか? – Anthon

+0

はい私は、いろいろな異なる要件を持つ様々なベンダー機器を備えたプレイ可能なプレイブックを生成しています。これらのすべてがYAMLファイルで定義される必要があります。これらの1000行以上は、さまざまな環境とロジックを定義する必要があるため、時間が経つにつれて大きく増加します(x環境タイプを使用する場合はy構造)。それと同時に、より大きなリソース効率が私にとってより良いものになります。 printを使ってファイルを作成するのではなく、これを直接フィードすることができれば、これをもっと効率的にすることができます。 – Fallacy11

1

printを使用して改行を取得できます。この方法でインタラクティブプロンプトに表示される文字列は、改行を決してしません。文字列の表示方法は、文字列の前後に引用符(')が表示されているとわかりますが、printとは表示されません。 PyYAMLとで

>>> 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

なぜ賛成投票ですか?私の答えは正しい... –

関連する問題