Comment puis-je analyser un fichier YAML en Python

Comment puis-je analyser un fichier YAML en Python?

363
demandé sur Omer Dagan 2009-11-21 02:16:16

7 réponses

la méthode la plus facile et la plus puriste sans s'appuyer sur les 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'informations ici:

http://pyyaml.org/wiki/PyYAMLDocumentation

502
répondu Jon 2018-05-08 16:13:44

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

fin du fichier commun

.yml et .yaml

Alternatives

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

  • prise en charge par d'autres langages de programmation
  • Lecture / écriture de la performance
  • compacité (Taille du fichier)

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

dans le cas où vous êtes plutôt à la recherche d'un moyen de créer des fichiers de configuration, vous pourriez vouloir lire mon court article fichiers de Configuration en Python

35
répondu Martin Thoma 2017-05-23 12:26:38

si vous avez YAML qui est conforme à la YAML 1.2 spécification (publié en 2009), alors vous devez utiliser ruamel.yaml (disclaimer: je suis l'auteur de ce forfait). Il s'agit essentiellement d'un super-ensemble de PyYAML, qui supporte la plus grande partie de YAML 1.1 (à partir de 2005).

si vous voulez être en mesure de préserver vos commentaires lors de voyage aller-retour, vous devez certainement utiliser ruamel.yaml.

améliorer L'exemple de @Jon est facile:

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, en avez besoin (rarement le cas) et savez ce que vous faites.

si vous utilisez pathlib Path pour manipuler des fichiers, vous êtes mieux d'utiliser la nouvelle API ruamel.yaml dispose:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
32
répondu Anthon 2018-08-23 17:12:55

importer le module yaml et charger le fichier dans un dictionnaire appelé 'my_dict':

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

C'est tout ce dont tu as besoin. Maintenant, tout le fichier yaml est dans le dictionnaire my_dict.

12
répondu Pal 2018-06-05 03:18:51

exemple:

par défaut.yaml

url: https://www.google.com

environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
4
répondu Prashanth Sams 2018-05-20 07:41:44

j'utilise ruamel.yaml . Détails & débat ici .

from ruamel import yaml

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

Usage de ruamel.yaml est compatible (avec quelques problèmes simples résolubles) avec les anciennes utilisations de PyYAML et comme il est indiqué dans le lien i fourni, utiliser

from ruamel import yaml

au lieu de

import yaml

et il corrigera la plupart de vos problèmes.

MODIFIER : PyYAML n'est pas mort comme il s'avère, c'est juste maintenu dans un autre endroit.

2
répondu Oleksandr Zelentsov 2018-03-20 16:53:26
#!/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 __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
0
répondu Wojciech Sciesinski 2017-10-09 14:59:39