¿Cómo puedo analizar un archivo YAML en Python?
¿Cómo puedo analizar un archivo YAML en Python?
Respuestas:
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 .
pip install pyyaml
, consulte esta publicación para obtener más opciones stackoverflow.com/questions/14261614/…
# -*- 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)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
y .yaml
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
€
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.7
open(doc_name, ..., encodung='utf8')
para leer y escribir, sin importar io
.
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:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Ú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:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
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':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Eso es todo lo que necesitas. Ahora todo el archivo yaml está en el diccionario 'my_dict'.
!!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 casos yaml.safe_load()
se puede usar).
import yaml
, pero ese no es un módulo incorporado, y no especificas qué paquete es. Ejecutando import yaml
en una nueva instalación de Python3 resultadosModuleNotFoundError: No module named 'yaml'
Ejemplo:
defaults.yaml
url: https://www.google.com
ambiente.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 solucionables simples) con los viejos usos de PyYAML y, como se indica en el enlace que proporcioné, use
from ruamel import yaml
en vez de
import yaml
y solucionará la mayoría de tus problemas.
EDITAR : PyYAML no está muerto como resultado, solo 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:]))
yaml.safe_load
ya que no puede ejecutar código arbitrario desde el archivo YAML.