2017-07-11 10 views
2

て複製エントリ私は次のような構造でYAMLを持っていますデータ(oldsコマンド)と新しいパラメータを反映するためのものです。編集既存のYAMLとPyYAMLと

jobStream = open("example.yaml", 'r') 
jobMap  = yaml.safe_load(jobStream) 

し、それへのアクセス:私はPyYAMLとを通してそれをロードしています

jobMap[0]['sequence']['commands'] 

は私が必要とするデータを戻します。しかし、私は単にのようなマージを通してそれを複製した場合:私はyaml.dump(jobMap)を行うしようとした場合

commandsA = jobMap[0]['sequence']['commands'] 
commandsB = jobMap[0]['sequence']['commands'] 
jobMap[0]['sequence']['commands'] = commandsA + commandsB 

を、それはコマンドが重複していませんが、IDが表示:リストcommandsAから

- *id001 
- *id002 
- *id003 
- *id004 
+0

このYAMLは無効で、でもちょうど '(...)'取り外す際は、keepgoing 'として:false'を、同じインデントレベルを持つことはできませんその上の配列要素として。あなたの投稿の "YAML"を削除し、あなたが持っているYAMLをコピーし、YAMLを構成するすべての行を選択して '{}'を押します。もしYAMLにタブ文字がなければ、今ある。 – Anthon

+0

PyYAMLを使用している特別な理由は何ですか?あなたのソースは、古いYAML 1.1標準に従っていますか? – Anthon

+0

@Anthon、ちょうどYAML形式を修正しました。ありがとうございます! そして私はPyYamlを使用しています。なぜなら、それは私がそれを行う方法であったからです。私は推奨すれば他のアプローチにもオープンしています。 –

答えて

0

要素そしてcommandsBから辞書はあなたがそれらをコピーする場合は、アンカー(&)とエイリアス(*

のThにつながる、同じ項目にあなたの構造体に複数の参照を取得します、ですあなたが欲しいYAMLを取得するための電子最も簡単な方法は、おそらくdeepcopyを使用している:

from copy import deepcopy 

jobMap[0]['sequence']['commands'] = deepcopy(commandsA) + deepcopy(commandsB) 
+0

ありがとう、私はそれをdeepcopyで働かせることができました! –

+0

アンカーとエイリアスの自動生成をオフにすることもできますが、そうしたようにファイルを操作するには、これは短く概念的にははるかに簡単です。 – Anthon

関連する問題