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

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

El método más fácil y más puro sin depender de los encabezados de C es PyYaml ( documentación ):

#!/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. También existe una función simple yaml.load() , pero siempre se debe preferir yaml.safe_load() menos que necesite explícitamente la serialización / deserialización de objetos arbitrarios para evitar introducir la posibilidad de ejecución de código arbitrario.

Tenga en cuenta que el proyecto PyYaml admite versiones hasta a través de la especificación YAML 1.1 . Si se necesita el soporte de la especificación YAML 1.2 , vea ruamel.yaml como se indica en esta respuesta .

Lee y escribe 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.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 

Finales de archivos comunes

.yml y .yaml

Alternativas

  • CSV: formato super simple ( lectura y escritura )
  • JSON: Agradable 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 Python ( lectura y escritura )
  • MessagePack ( paquete de Python ): Representación más compacta ( lectura y escritura )
  • HDF5 ( paquete de Python ): agradable para matrices ( lectura y escritura )
  • XML: existe también * suspiro * ( lectura y escritura )

Para su aplicación, lo siguiente podría ser importante:

  • Soporte por otros lenguajes de progtwigción.
  • Rendimiento de lectura / escritura
  • Compacidad (tamaño del 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, puede leer mi artículo corto Archivos de configuración en Python

Si tiene YAML que cumple con la especificación YAML 1.2 (lanzada en 2009), debe usar ruamel.yaml (exención 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 cuando realiza un viaje de ida y vuelta, debe utilizar 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) 

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

Si está usando pathlib Path para manipular archivos, es mejor usar 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) 

Importe el módulo yaml y cargue el archivo en un diccionario llamado ‘my_dict’:

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

Eso es todo lo que necesitas. Ahora todo el archivo yaml está en el diccionario ‘my_dict’.

Ejemplo:

defaults.yaml

 url: https://www.google.com 

environment.py

 from ruamel import yaml data = yaml.safe_load(open('defaults.yaml')) data['url'] 

Yo uso ruamel.yaml . Detalles y debate aquí .

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

El uso de ruamel.yaml es compatible (con algunos problemas solubles simples) con los usos antiguos de PyYAML y, como se indica en el enlace que proporcioné, use

 from ruamel import yaml 

en lugar de

 import yaml 

y solucionará la mayoría de tus problemas.

EDITAR : PyYAML no está muerto, pero se mantiene en un lugar diferente.

 #!/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:]))