web-dev-qa-db-fra.com

Modification du fichier YAML par Python

J'ai un fichier YAML qui ressemble à ceci:

# Sense 1
- name  : sense1
  type  : float
  value : 31

# sense 2
- name  : sense2
  type  : uint32_t
  value : 1488

# Sense 3
- name  : sense3
  type  : int32_t
  value : 0

- name  : sense4
  type  : int32_t
  value : 0
- name  : sense5
  type  : int32_t
  value : 0
- name  : sense6
  type  : int32_t
  value : 0

Je veux utiliser Python pour ouvrir ce fichier, modifier certaines valeurs (voir ci-dessus) et fermer le fichier. Comment puis-je faire cela?

Par exemple, je veux définir sense2 [valeur] = 1234, en gardant la sortie YAML identique.

12
with open("my_file.yaml") as f:
     list_doc = yaml.load(f)

for sense in list_doc:
    if sense["name"] == "sense2":
         sense["value"] = 1234

with open("my_file.yaml", "w") as f:
    yaml.dump(list_doc, f)
10
jwilner

Si vous vous souciez de préserver l'ordre de vos clés de mappage, le commentaire et l'espace blanc entre les éléments de la séquence de niveau racine, par exemple car ce fichier est sous contrôle de révision, vous devez utiliser ruamel.yaml (clause de non-responsabilité: je suis l'auteur de ce package).

En supposant que votre document YAML se trouve dans le fichier input.yaml:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
# yaml.preserve_quotes = True
with open('input.yaml') as fp:
    data = yaml.load(fp)
for elem in data:
    if elem['name'] == 'sense2':
         elem['value'] = 1234
         break  # no need to iterate further
yaml.dump(data, sys.stdout)

donne:

# Sense 1
- name: sense1
  type: float
  value: 31

# sense 2
- name: sense2
  type: uint32_t
  value: 1234

# Sense 3
- name: sense3
  type: int32_t
  value: 0

- name: sense4
  type: int32_t
  value: 0
- name: sense5
  type: int32_t
  value: 0
- name: sense6
  type: int32_t
  value: 0
2
Anthon