web-dev-qa-db-fra.com

Comment analyser un fichier YAML en Python

Comment analyser un fichier YAML en Python?

413
Szymon Lipiński

La méthode la plus simple et la plus pure sans recourir aux en-têtes C est PyYaml:

#!/usr/bin/env python

import yaml

with open("example.yaml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Et c'est tout. Plus d'infos ici:

http://pyyaml.org/wiki/PyYAMLDocumentation

565
Jon

Lire et écrire des fichiers YAML avec Python 2 + 3 (et unicode)

# -*- coding: utf-8 -*-
import yaml
import io

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write YAML file
with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)

# Read YAML file
with open("data.yaml", 'r') as stream:
    data_loaded = yaml.load(stream)

print(data == data_loaded)

Fichier YAML créé

a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42

Terminaisons de fichier communes

.yml et .yaml

Des alternatives

Pour votre application, les éléments suivants peuvent être importants:

  • Prise en charge par d'autres langages de programmation
  • Lecture/écriture
  • Compacité (taille de fichier)

Voir aussi: Comparaison des formats de sérialisation des données

Si vous cherchez plutôt un moyen de créer des fichiers de configuration, vous pouvez lire mon court article Fichiers de configuration en Python

47
Martin Thoma

Si vous avez YAML conforme à la spécification YAML 1.2 (publié en 2009), vous devez utiliser ruamel.yaml (disclaimer: je suis l'auteur de ce paquet) . de PyYAML, qui prend en charge la majorité de YAML 1.1 (à partir de 2005).

Si vous voulez pouvoir conserver vos commentaires lors des allers-retours, vous devriez certainement utiliser ruamel.yaml. 

La mise à niveau de l'exemple de Jon est simple:

import ruamel.yaml as yaml

with open("example.yaml") as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Utilisez safe_load() sauf si vous avez le contrôle total sur l'entrée, si vous en avez besoin (rarement le cas) et si vous savez ce que vous faites.

Si vous utilisez pathlib Path pour manipuler des fichiers, il vaut mieux utiliser la nouvelle API ruamel.yaml fournit:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
42
Anthon

Importez le module yaml et chargez le fichier dans un dictionnaire appelé 'my_dict':

import yaml
my_dict = yaml.load(open('filename'))

C'est tout ce dont vous avez besoin. L'ensemble du fichier yaml se trouve maintenant dans le dictionnaire "my_dict".

17
Pal

Exemple:

defaults.yaml

url: https://www.google.com

environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
6
Prashanth Sams

J'utilise ruamel.yamlDétails & débat ici.

from ruamel import yaml

with open(filename, 'r') as fp:
    read_data = yaml.load(fp)

L'utilisation de ruamel.yaml est compatible (avec quelques problèmes simples pouvant être résolus) avec les anciens usages de PyYAML et, comme indiqué dans le lien que j'ai fourni, utilisez 

from ruamel import yaml

au lieu de 

import yaml

et cela résoudra la plupart de vos problèmes.

EDIT: PyYAML n'est pas mort, il est simplement maintenu à un endroit différent.

2
Oleksandr Zelentsov
#!/usr/bin/env python

import sys
import yaml

def main(argv):

    with open(argv[0]) as stream:
        try:
            #print(yaml.load(stream))
            return 0
        except yaml.YAMLError as exc:
            print(exc)
            return 1

if __== "__main__":
    sys.exit(main(sys.argv[1:]))
0