Mise à jour de fichier YAML par programmation
J'ai un Python dict qui vient de la lecture d'un fichier YAML avec l'habitude
yaml.load(stream)
J'aimerais mettre à jour le fichier YAML par programme donné un chemin pour être mis à jour comme d':
groupe1,option1,option11,valeur
et d'enregistrer le résultat dict à nouveau comme un fichier yaml. Je suis confronté au problème de la mise à jour d'un dicntionary, en tenant compte que le chemin est dynamique (disons un utilisateur est en mesure de saisir le chemin d'accès par le biais d'un simple CLI, je l'ai créé à l'aide de Cmd).
Des idées?
merci!
Mise à JOUR
Permettez-moi d'être plus précis sur la question: Le problème avec la mise à jour de la partie d'un dictionnaire où je ne sais pas à l'avance la structure. Je travaille sur un projet où toute la configuration est stockée sur les fichiers YAML, et je veux ajouter une CLI pour éviter d'avoir à éditer à la main. Cette un fichier YAML, chargé d'un dictionnaire (config-dict) à l'aide de PyYaml:
config:
a-function: enable
b-function: disable
firewall:
NET:
A:
uplink: enable
downlink: enable
B:
uplink: enable
downlink: enable
subscriber-filter:
cancellation-timer: 180
service:
copy:
DS: enable
remark:
header-remark:
DSC: enable
remark-table:
port:
linkup-debounce: 300
p0:
mode: amode
p1:
mode: bmode
p2:
mode: amode
p3:
mode: bmode
J'ai créé la CLI avec Cmd, et ça fonctionne très bien même avec l'auto-complétion. L'utilisateur peut fournir une ligne comme:
config port p1 mode amode
Donc, j'ai besoin de modifier:
config-dict['config']['port']['p1']['mode'] et le mettre à "amode'. Ensuite, utilisez yaml.dump() pour créer le fichier de nouveau. Une autre ligne serait:
config a-function enable
Donc config-dict['config']['d'une fonction'] doit être réglé sur "activer".
Mon problème est lors de la mise à jour du dictionnaire. Si Python les valeurs passées en tant que référence serait facile: il suffit de parcourir le dict jusqu'à ce que la valeur est trouvée et l'enregistrer. Effectivement, c'est ce que je fais pour le Cmd de saisie semi-automatique. Mais je ne sais pas comment faire la mise à jour.
Espère que j'ai expliqué me suis mieux maintenant!
Merci d'avance.
yaml.dump
facile, mais vous vous demandez pour la conception de votre application. C'est trop difficile, de l'avis de la base, et, en fait, n'a pas beaucoup à faire avec YAML.merci pour votre réponse. Vous avez raison, je suis en demandant plus à propos de Python que YAML lui-même. Il n'est pas sur le design, mais une question très précise: Comment mettre à jour un dictionnaire qui a une dynamique de la taille.
Euh, je ne vois pas un problème ici - vraiment simple serait d'analyser le chemin indiqué sur la cli, marcher à travers votre dictionnaire pour assurer le chemin est valide, changer la valeur de vidage. Où est le problème? Autre que cela - qu'avez-vous essayé, ce qui n'a pas de travail, de coller du code.
Double Possible de l'Accès python imbriquée des éléments dans le dictionnaire via une liste de touches
OriginalL'auteur Ignacio Verona | 2014-05-28
Vous devez vous connecter pour publier un commentaire.
En fait la solution suit simple formulation: charge - modifier - dump:
Avant de jouer, assurez-vous d'avoir pyyaml installé:
testyaml.py
Résultant
data.yaml
Pour modifier dict dynamique avec nombre de touches, voir stackoverflow.com/questions/17462011/...
qui travaille pour l'insertion, mais quid de la mise à jour? Si python autorisé par référence ce sera facile, mais comme elle n'a pas c'est un peu difficile pour moi!
OriginalL'auteur Jan Vlcinsky
La mise à jour semble à l'endroit où pyyaml en deçà. Vous ne pouvez même pas utiliser yaml.charge sur un fichier qui a été ouvert dans (a)ppend mode sans exception. Maintenant, cela peut être un peu fastidieux pour des complexes de dictionnaires, mais si chaque élément représente un cas à part ou le document que vous pourrait le manipuler comme s'il s'agissait de tout autre fichier texte.
Alors que ce n'est pas nécessairement la valeur de la mise à jour, il ne permet pas pour le fichier de mise à jour. Vous pouvez aussi rechercher dans l'aide de json.dump sur le fichier. Je sais que c'est en YAML, mais les formats sont largement compatibles, sauf si vous utilisez python-objet en fonction de stockage en YAML.
Pour un système d'exploitation agnostique approche pour le transport de personnage affectation n'oubliez pas d'utiliser le système d'exploitation.linesep.
Meilleur de la chance. Espérons que cette aide.
Merci pour la capture. Honnêtement, flush() est juste à la force de l'habitude à ce stade. Et j'oublie toujours si/où il devrait y avoir une close(). Merci encore.
OriginalL'auteur Dan Temkin
Essayer cette méthode, je suis à l'aide de la mise à jour de données ou des fichiers json.
dictionnairedef update_dictionary_recursively(dictionary, key, value, key_separator="."):
"""Update given
with the given
cléand
valeur".`
OriginalL'auteur Jyoti Arora