¿Cómo puedo analizar un archivo YAML en Python?
611
El método más sencillo y puro sin depender de los encabezados C es PyYaml ( documentación ), que se puede instalar a través de pip install pyyaml
:
#!/usr/bin/env python
import yaml
import json
with open("example.yaml", 'r') as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Y eso es. yaml.load()
También existe una función simple , 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 .
yaml.safe_load
ya que no puede ejecutar código arbitrario desde el archivo YAML.pip install pyyaml
, consulte esta publicación para obtener más opciones stackoverflow.com/questions/14261614/…Leer y escribir archivos YAML con Python 2 + 3 (y unicode)
Archivo YAML creado
Finales de archivo comunes
.yml
y.yaml
Alternativas
Para su aplicación, lo siguiente puede ser importante:
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 breve artículo Archivos de configuración en Python
fuente
€
en Windows es€
. Alguien sabe el motivo?io.open(doc_name, 'r', encoding='utf8')
para leer el carácter especial. YAML versión 0.1.7open(doc_name, ..., encodung='utf8')
para leer y escribir, sin importario
.Si tiene YAML que cumple con la especificación YAML 1.2 (lanzada en 2009), entonces debe 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 cuando realiza un viaje de ida y vuelta, debe utilizar ruamel.yaml.
Actualizar el ejemplo de @ Jon es fácil:
Úselo a
safe_load()
menos que realmente tenga control total sobre la entrada, la necesite (rara vez 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:fuente
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
). Intenté establecer yaml.encoding en utf-8 pero no funcionó ya que el método de carga en YAML todavía usa el código ascii_decode. ¿Es esto un error?Primero instale pyyaml usando pip3.
Luego importe el módulo yaml y cargue el archivo en un diccionario llamado 'my_dict':
Eso es todo lo que necesitas. Ahora todo el archivo yaml está en el diccionario 'my_dict'.
fuente
!!python
), también puede ser inseguro (como en el disco duro completo)yaml.load()
. Como eso está claramente documentado, debería haber repetido esa advertencia aquí (en casi todos los casosyaml.safe_load()
se puede usar).import yaml
, pero ese no es un módulo incorporado, y no especificas qué paquete es. Ejecutandoimport yaml
en una nueva instalación de Python3 resultadosModuleNotFoundError: No module named 'yaml'
Ejemplo:
fuente
Yo uso ruamel.yaml .
Detalles y debate aquí.El uso de ruamel.yaml es compatible (con algunos problemas solucionables simples) con los viejos usos de PyYAML y, como se indica en el enlace que proporcioné, use
en vez de
y solucionará la mayoría de tus problemas.
EDITAR : PyYAML no está muerto como resultado, solo se mantiene en un lugar diferente.
fuente
fuente