Leer y escribir YAML en un archivo en Python

En este tutorial, vamos a aprender a usar la biblioteca YAML en Python 3. YAML significa Otro lenguaje de marcado más. En los últimos años se ha vuelto muy...

Introducción

En este tutorial, vamos a aprender a usar la biblioteca YAML en Python 3. YAML significa Yet Another Markup Language.

En los últimos años se ha vuelto muy popular por su uso en el almacenamiento de datos de forma serializada para archivos de configuración. Dado que YAML es esencialmente un formato de datos, la biblioteca YAML es bastante breve, ya que la única funcionalidad requerida es la capacidad de analizar archivos con formato YAML.

En este artículo, comenzaremos viendo cómo se almacenan los datos en un archivo YAML, y luego cargaremos esos datos en un objeto de Python. Por último, aprenderemos cómo almacenar un objeto de Python en un archivo YAML. Vamos a empezar.

Antes de continuar, hay algunos requisitos previos para este tutorial. Debe tener una comprensión básica de la sintaxis de Python y/o tener al menos experiencia de programación de nivel principiante con algún otro lenguaje. Aparte de eso, el tutorial es bastante simple y fácil de seguir para principiantes.

Instalación

El proceso de instalación de YAML es bastante sencillo. Hay dos maneras de hacerlo; Comenzaremos con el fácil primero:

Método 1: a través de Pip

La forma más sencilla de instalar la biblioteca YAML en Python es a través del administrador de paquetes pepita. Si tiene pip instalado en su sistema, ejecute el siguiente comando para descargar e instalar YAML:

1
$ pip install pyyaml

Método 2: a través de la fuente

En caso de que no tengas pip instalado, o tengas algún problema con el método anterior, puedes ir a la [página de origen] de la biblioteca (https://github.com/yaml/pyyaml). Descargue el repositorio como un archivo zip, abra la terminal o el símbolo del sistema y navegue hasta el directorio donde se descarga el archivo. Una vez que esté allí, ejecute el siguiente comando:

1
$ python setup.py install

Ejemplos de código YAML

En esta sección, aprenderemos cómo manejar (manipular) archivos YAML, comenzando con cómo leerlos, es decir, cómo cargarlos en nuestro script de Python para que podamos usarlos según nuestras necesidades. Entonces, comencemos.

Leer archivos YAML en Python

En esta sección, veremos cómo leer archivos YAML en Python.

Comencemos creando dos archivos con formato YAML.

El contenido del primer archivo es el siguiente:

1
2
3
4
5
6
7
# fruits.yaml file

apples: 20
mangoes: 2
bananas: 3
grapes: 100
pineapples: 1

El contenido del segundo archivo es el siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# categories.yaml file

sports:

  - soccer
  - football
  - basketball
  - cricket
  - hockey
  - table tennis

countries:

  - Pakistan
  - USA
  - India
  - China
  - Germany
  - France
  - Spain

Puedes ver que los archivos fruits.yaml y categories.yaml contienen diferentes tipos de datos. El primero contiene información solo sobre una entidad, es decir, frutas, mientras que el segundo contiene información sobre deportes y países.

Intentemos ahora leer los datos de los dos archivos que creamos usando un script de Python. El método load() del módulo yaml se puede usar para leer archivos YAML. Mira el siguiente guión:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# process_yaml.py file

import yaml

with open(r'E:\data\fruits.yaml') as file:
    # The FullLoader parameter handles the conversion from YAML
    # scalar values to Python the dictionary format
    fruits_list = yaml.load(file, Loader=yaml.FullLoader)

    print(fruits_list)

Producción:

1
{ 'apples': 20, 'mangoes': 2, 'bananas': 3, 'grapes': 100, 'pineapples': 1 }

En el script anterior, especificamos yaml.FullLoader como el valor para el parámetro Loader que carga el lenguaje YAML completo, evitando la ejecución de código arbitrario. En lugar de usar la función load y luego pasar yaml.FullLoader como valor para el parámetro Loader, también puedes usar la función full_load(), como veremos en el siguiente ejemplo.

Intentemos ahora leer el segundo archivo YAML de manera similar usando un script de Python:

1
2
3
4
5
6
7
8
9
# read_categories.py file

import yaml

with open(r'E:\data\categories.yaml') as file:
    documents = yaml.full_load(file)

    for item, doc in documents.items():
        print(item, ":", doc)

Dado que hay 2 documentos en el archivo categories.yaml, ejecutamos un ciclo para leer ambos.

Producción:

1
2
sports : ['soccer', 'football', 'basketball', 'cricket', 'hockey', 'table tennis']
countries : ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']

Como puede ver en los últimos dos ejemplos, la biblioteca maneja automáticamente la conversión de datos con formato YAML a diccionarios y listas de Python.

Escribir archivos YAML en Python

Ahora que hemos aprendido cómo convertir un archivo YAML en un diccionario de Python, intentemos hacer las cosas al revés, es decir, serializar un diccionario de Python y almacenarlo en un archivo con formato YAML. Para este propósito, usemos el mismo diccionario que obtuvimos como resultado de nuestro último programa.

1
2
3
4
5
6
7
import yaml

dict_file = [{'sports' : ['soccer', 'football', 'basketball', 'cricket', 'hockey', 'table tennis']},
{'countries' : ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']}]

with open(r'E:\data\store_file.yaml', 'w') as file:
    documents = yaml.dump(dict_file, file)

El método dump() toma el diccionario Python como el primero y un objeto File como segundo parámetro.

Una vez que se ejecuta el código anterior, se creará un archivo llamado store_file.yaml en su directorio de trabajo actual.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# store_file.yaml file contents:

- sports:

  - soccer
  - football
  - basketball
  - cricket
  - hockey
  - table tennis
- countries:

  - Pakistan
  - USA
  - India
  - China
  - Germany
  - France
  - Spain

Otra funcionalidad útil que ofrece la biblioteca YAML para el método dump() es el parámetro sort_keys. Para mostrar lo que hace, apliquémoslo en nuestro primer archivo, es decir, fruit.yaml:

1
2
3
4
5
6
7
import yaml

with open(r'E:\data\fruits.yaml') as file:
    doc = yaml.load(file, Loader=yaml.FullLoader)

    sort_file = yaml.dump(doc, sort_keys=True)
    print(sort_file)

Producción:

1
2
3
4
5
apples: 20
bananas: 3
grapes: 100
mangoes: 2
pineapples: 1

Puede ver en la salida que las frutas se han clasificado en orden alfabético.

Conclusión

En este breve tutorial, aprendimos cómo instalar la biblioteca YAML de Python (pyyaml) para manipular archivos con formato YAML. Cubrimos la carga del contenido de un archivo YAML en nuestro programa de Python como diccionarios, así como la serialización de diccionarios de Python en archivos YAML y el almacenamiento de sus claves. La biblioteca es bastante breve y solo ofrece funcionalidades básicas.