Saltar al contenido

¿Cómo puedo analizar un archivo YAML en Python?

Solución:

El método más sencillo y puro sin depender de los encabezados de C es PyYaml (documentación), que se puede instalar a través de pip install pyyaml:

#!/usr/bin/env python

import yaml

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

Y eso es. Una llanura yaml.load() La función también existe, pero yaml.safe_load() siempre debe preferirse a menos que necesite explícitamente la serialización / deserialización de objetos arbitrarios proporcionada para evitar introducir la posibilidad de ejecución de código arbitrario.

Tenga en cuenta que el proyecto PyYaml admite versiones hasta la especificación YAML 1.1. Si se necesita compatibilidad con la especificación YAML 1.2, consulte ruamel.yaml como se indica en esta respuesta.

Leer y escribir archivos YAML con Python 2 + 3 (y 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.safe_load(stream)

print(data == data_loaded)

Archivo YAML creado

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

Terminaciones de archivos comunes

.yml y .yaml

Alternativas

  • CSV: formato súper simple (lectura y escritura)
  • JSON: bueno para escribir datos legibles por humanos; MUY de uso común (lectura y escritura)
  • YAML: YAML es un superconjunto de JSON, pero más fácil de leer (lectura y escritura, comparación de JSON y YAML)
  • pickle: un formato de serialización de Python (lectura y escritura)
  • MessagePack (paquete Python): representación más compacta (lectura y escritura)
  • HDF5 (paquete Python): bueno para matrices (lectura y escritura)
  • XML: también existe * suspiro * (leer y escribir)

Para su aplicación, lo siguiente puede ser importante:

  • Soporte de otros lenguajes de programación
  • Rendimiento de lectura / escritura
  • Compacidad (tamaño de archivo)

Ver también: Comparación de formatos de serialización de datos

En caso de que esté buscando una forma de crear archivos de configuración, es posible que desee leer mi artículo corto Archivos de configuración en Python

Si tiene YAML que cumple con la especificación YAML 1.2 (publicada en 2009), entonces debería usar ruamel.yaml (descargo de responsabilidad: soy el autor de ese paquete). Es esencialmente un superconjunto de PyYAML, que admite la mayor parte de YAML 1.1 (desde 2005).

Si desea poder conservar sus comentarios al realizar un viaje de ida y vuelta, ciertamente debería usar ruamel.yaml.

Actualizar el ejemplo de @ Jon es fácil:

import ruamel.yaml as yaml

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

Usar safe_load() a menos que realmente tenga control total sobre la entrada, la necesita (rara vez es el caso) y sepa lo que está haciendo.

Si está utilizando pathlib Path para manipular archivos, es mejor utilizar la nueva API que ruamel.yaml proporciona:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *