le dumping un dictionnaire dans un fichier YAML, tandis que le maintien de l'ordre
J'ai essayé de vider un dictionnaire dans un fichier YAML. Le problème est que le programme qui importe le fichier YAML besoins les mots-clés dans un ordre spécifique. Cet ordre est pas par ordre alphabétique.
import yaml
import os
baseFile = 'myfile.dat'
lyml = [{'BaseFile': baseFile}]
lyml.append({'Environment':{'WaterDepth':0.,'WaveDirection':0.,'WaveGamma':0.,'WaveAlpha':0.}})
CaseName = 'OrderedDict.yml'
CaseDir = r'C:\Users\BTO\Documents\Projects\Mooring code testen'
CaseFile = os.path.join(CaseDir, CaseName)
with open(CaseFile, 'w') as f:
yaml.dump(lyml, f, default_flow_style=False)
Ce produit a *.fichier yml qui est formaté comme ceci:
- BaseFile: myfile.dat
- Environment:
WaterDepth: 0.0
WaveAlpha: 0.0
WaveDirection: 0.0
WaveGamma: 0.0
Mais ce que je veux, c'est que l'ordre est préservé:
- BaseFile: myfile.dat
- Environment:
WaterDepth: 0.0
WaveDirection: 0.0
WaveGamma: 0.0
WaveAlpha: 0.0
Est-ce possible?
Vous devez vous connecter pour publier un commentaire.
Utiliser un OrderedDict au lieu de dict. Exécutez le ci-dessous de code de configuration au démarrage. Maintenant
yaml.dump
, doit préserver l'ordre. Plus de détails ici et iciExemple: https://pastebin.com/raw.php?i=NpcT6Yc4
PyYAML prend en charge
representer
pour sérialiser une instance de classe à un YAML nœud.Ajouter les lignes suivantes au-dessus de votre code:
Ensuite, vous pouvez utiliser
OrderedDict
de préserver l'ordre dansyaml.dump()
:3 Ans plus tard - yaml.dump a un sort_keys kwarg qui est définie sur True par défaut. Mettre à False pour ne pas réorganiser:
Vos difficultés sont le résultat d'hypothèses sur plusieurs niveaux qui sont inexactes et, en fonction de votre YAML analyseur, peut-être pas de manière transparente, qui peut être résolu.
En Python
dict
les touches sont non ordonnée (au moins pour Python < 3.6). Et même si les clés ont un peu d'ordre dans le fichier source, dès qu'ils sont dans ledict
ils ne sont pas:donne:
Si vous voulez que vos clés commandé, vous pouvez utiliser les collections.OrderedDict type (ou mon propre ruamel.ordereddict type qui est dans C et à plus d'un ordre de grandeur plus rapide), et vous avez pour ajouter les clés commandé, soit comme une liste de tuples:
qui permet d'imprimer les touches dans l'ordre qu'ils ont été spécifiés dans la source.
Le deuxième problème est que, même si un Python dict a une certaine touche de commande qui se trouve être ce que vous voulez, les spécifications YAML ne veut explicitement dire que les mappages sont non ordonnée et c'est de cette façon par exemple PyYAML met en œuvre le dumping de Python dict pour YAML la cartographie (Et l'inverse).
Aussi, si vous videz une ordereddict ou OrderedDict que vous n'avez normalement pas obtenir la plaine YAML de cartographie qui vous indiquent que vous voulez, mais certains tagged YAML entrée.
Que la perte de l'ordre est souvent pas souhaitable, dans votre cas, parce que votre lecteur suppose un certain ordre, dans mon cas, parce que il est difficile de comparer des versions parce que la clé de la commande ne serait pas compatible après l'insertion, la suppression, j'ai mis en place l'aller-retour de la cohérence dans ruamel.yaml de sorte que vous pouvez faire:
qui vous donne exactement le résultat de sortie.
data
fonctionne comme une dict (et donc que les données de['Environnement'], mais en dessous, ils sont plus intelligents qui permettaient de préserver l'ordre, des commentaires, YAML des noms d'ancre, etc). Vous pouvez bien sûr modifier ces (ajout/suppression de paires clé-valeur), ce qui est facile, mais vous pouvez également les construire à partir de zéro:Qui encore une fois imprime le contenu avec les clés dans l'ordre que vous désirez.
Je trouve la plus tard de moins en moins lisible, que lors du démarrage à partir d'un fichier YAML de la chaîne, mais il n'construire le lyml structure des données un peu plus rapide.