2017-10-13 5 views
1

Je voudrais avoir imprimé la mise en page suivante:noeud insertion dans yaml avec ruamel

extra: identifiers: biotools: - http://bio.tools/abyss

Je suis en utilisant ce code pour ajouter des nœuds:

yaml_file_content['extra']['identifiers'] = {}
yaml_file_content['extra']['identifiers']['biotools'] = ['- http://bio.tools/abyss']

Mais, au lieu , J'obtiens cette sortie, qui encapsule l'outil dans []:

extra: identifiers: biotools: ['- http://bio.tools/abyss']

J'ai essayé d'autres combinaisons mais je n'ai pas travaillé?

Répondre

1

Le tableau de bord en - http://bio.tools/abyss indique un élément de séquence et est ajouté à la sortie si vous videz une liste Python dans le style de bloc.

Ainsi, au lieu de faire:

yaml_file_content['extra']['identifiers']['biotools'] = ['- http://bio.tools/abyss'] 

vous devez faire:

yaml_file_content['extra']['identifiers']['biotools'] = ['http://bio.tools/abyss'] 

puis forcer la sortie de tous les éléments composites dans le style de bloc à l'aide:

yaml.default_flow_style = False 

Si vous voulez un contrôle plus fin, créez une instance ruamel.yaml.comments.CommentedSeq:

tmp = ruamel.yaml.comments.CommentedSeq(['http://bio.tools/abyss']) 
tmp.fa.set_block_style() 
yaml_file_content['extra']['identifiers']['biotools'] = tmp 
+0

Merci, @Anthon. Cela fonctionne parfaitement bien. Ce serait génial si certains de ces exemples vont directement à la documentation pour améliorer la convivialité de la bibliothèque. – ypriverol

+1

Si cette réponse résout votre problème, veuillez considérer * l'accepter * en cliquant sur le bouton ✔ (coche) à côté de la réponse. C'est ainsi que d'autres personnes savent que votre problème a été résolu, sans lire les commentaires.Il change également l'apparence de la question et cette réponse dans les listes. Si une meilleure réponse vient, vous pouvez toujours changer la réponse acceptée. – Anthon

1

Une fois que vous avez chargé un fichier YAML, ce n'est plus "yaml"; il est maintenant une structure de données Python, et le contenu de la clé biotools est un list:

>>> import ruamel.yaml as yaml 
>>> data = yaml.load(open('data.yml')) 
>>> data['extra']['identifiers']['biotools'] 
['http://bio.tools/abyss'] 

Comme toute autre liste Python, vous pouvez append à elle:

>>> data['extra']['identifiers']['biotools'].append('http://bio.tools/anothertool') 
>>> data['extra']['identifiers']['biotools'] 
['http://bio.tools/abyss', 'http://bio.tools/anothertool'] 

Et si vous imprimez la structure de données que vous obtenez YAML valide:

>>> print(yaml.dump(data)) 
extra: 
    identifiers: 
    biotools: [http://bio.tools/abyss, http://bio.tools/anothertool] 

Bien sûr, si pour une raison quelconque, vous ne aimez pas que la représentation de la liste, vous pouvez également obtenir les s yntactically équivalent:

>>> print(yaml.dump(data, default_flow_style=False)) 
extra: 
    identifiers: 
    biotools: 
    - http://bio.tools/abyss 
    - http://bio.tools/anothertool 
+0

J'ai modifié ma question, le problème est avec la sortie, qui utilise [] en mon nom d'outil quand je voudrais avoir une nouvelle ligne avec '- http: // bio.tools/abyss' @larsks – ypriverol

+0

Je ne suis pas sûr que vous ayez bien compris ma réponse, mais j'ai ajouté d'autres exemples pour essayer de clarifier les choses. – larsks

+0

'dump() a un argument mot-clé inattendu 'default_flow_style'' J'utilise le' de ruamel.yaml import YAML' avec le plugin pour jinja2 – ypriverol