yaml-xml-json
Network Programmability and AutomationPythonTutoriales

¿Cómo “Parsear” datos desde XML, JSON y YAML hacia Python?

Introducción

Los formatos de datos son una sintaxis que las aplicaciones acuerdan para intercambiar datos entre ellas. Los más utilizados con las API de red y las herramientas de automatización son XML, JSON y YAML. Un formato estándar puede permitir que un conjunto diverso de software escrito en el mismo o diferentes lenguajes de programación se comuniquen entre sí.

En este artículo vamos explicar cómo parsear datos desde los formatos XML, JSON y YAML hacia Python, para que estos puedan ser estructurados y manipulados. Nos enfocaremos en estructurar estos datos en Diccionarios de Python.

Requerimientos

  • Una computadora con Linux y Python instalado(Ver este artículo si necesitas instalar Python en Linux).

¿Cómo convertir JSON a Diccionario en Python?

Recordando algunas características de JSON

  • Las formas de formatear y transmitir datos son legibles tanto por humanos como por máquinas.
  • Envía objetos de datos usando pares Nombre-Valor, pares Llave-Valor.
  • JSON se asemeja más estrechamente al tipo de datos del diccionario en Python.
  • Las API a menudo devuelven strings en JSON. 

Ejemplo de un texto en formato JSON:

{
      “Routers”: [ 
                   { 
                     “Hostname”: “R1”,
                     “Vendor”: “Cisco”, 
                     “Id”: “1” 
                   }, 
                   { 
                     “Hostname”: “R2”,
                     “Vendor”: “Huawei”,
                     “Id”: “2” 
                   }
                ]
}

Leer datos en JSON desde un archivo con Python

Tomemos el texto del ejemplo anterior y guardemoslo en un archivo llamado “json_data.txt”. A continuación les muestro un código simple utilizando el módulo de python llamado “json” para leer los datos en json e imprimirlos en pantalla.

import json
with open('json_data.txt') as json_data:
    json_parsed = json.loads(json_data.read())
print(json.dumps(json_parsed, indent=4, sort_keys=True))

La salida que obtendremos será exactamente lo que tenemos en el archivo.

{
      “Routers”: [ 
                   { 
                     “Hostname”: “R1”,
                     “Vendor”: “Cisco”, 
                     “Id”: “1” 
                   }, 
                   { 
                     “Hostname”: “R2”,
                     “Vendor”: “Huawei”,
                     “Id”: “2” 
                   }
                ]
}

Si tomamos el código anterior, eliminamos la línea de “print” y agregamos la siguiente línea:

print(json_parsed)
type(json_parsed)

Veremos que los datos están guardados en un diccionario de Python.

¿Cómo convertir XML a Diccionario en Python?

Recordando algunas características de XML

  • Independiente de un lenguaje de programación
  • Forma de formatear y transmitir datos son legibles tanto por humanos como por máquinas.
  • No tan legible como JSON
  • No existe un objeto de Python nativo para estructurar los datos.

Ejemplo de texto en XML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <Routers>
    <Hostname>R1</Hostname>
    <Vendor>Cisco</Vendor>
    <Id>1</Id>
  </Routers>
  <Routers>
    <Hostname>R2</Hostname>
    <Vendor>Huawei</Vendor>
    <Id>2</Id>
  </Routers>
</root>

Leer datos en XML desde un archivo con Python

Una de las formas más facil de parsear datos en XML hacia Python es a tráves del módulo “xmltodict”. Para instalar este módulo ejecutamos el siguiente comando:

$ pip install xmltodict

Tomemos el texto del ejemplo anterior y guardemoslo en un archivo llamado “xml_data.txt”. A continuación les muestro un código simple utilizando el módulo de python “xmltodict” para leer los datos en xml e imprimirlos en pantalla en la estructura de Python.

import xmltodict
with open('xml_data.txt') as xml_data:
    xml_parsed = xmltodict.parse(xml_data.read())
print(xml_parsed)
print()
print(xml_parsed['root'])
print()
print(xml_parsed['root']['Routers'])
print()
print(xml_parsed['root']['Routers'][0])

Como podemos ver las salidas son diccionarios ordenados de Python:

OrderedDict([('root', OrderedDict([('Routers', [OrderedDict([('Hostname', 'R1'), ('Vendor', 'Cisco'), ('Id', '1')]), OrderedDict([('Hostname', 'R2'), ('Vendor', 'Huawei'), ('Id', '2')])])]))])
OrderedDict([('Routers', [OrderedDict([('Hostname', 'R1'), ('Vendor', 'Cisco'), ('Id', '1')]), OrderedDict([('Hostname', 'R2'), ('Vendor', 'Huawei'), ('Id', '2')])])])
[OrderedDict([('Hostname', 'R1'), ('Vendor', 'Cisco'), ('Id', '1')]), OrderedDict([('Hostname', 'R2'), ('Vendor', 'Huawei'), ('Id', '2')])]
OrderedDict([('Hostname', 'R1'), ('Vendor', 'Cisco'), ('Id', '1')])

¿Cómo convertir YAML a Diccionario en Python?

YAML es el formato de datos más popular para la automatización de redes debido a su particularidad de ser un formato de datos amigable para los humanos. Este fue el objetivo principal de los creadores. En el sitio web oficial se define como: “YAML es un estándar de serialización de datos amigable para todos los lenguajes de programación”.

Recordando algunas características de YAML

  • YAML es visualmente más fácil de ver que JSON y que XML.
  • La estructura del documento se denota indentando con espacios en blanco
  • Los miembros de las listas se denotan encabezados por un guión() con un miembro por cada línea.
  • Los comentarios vienen encabezados por la almohadilla ( # ) y continúan hasta el final de la línea.
  • Se pueden incluir múltiples documentos dentro de un único flujo, separándolos por tres guiones ( – – –).
  • Los vectores asociativos se representan usando los dos puntos seguidos por un espacio. en la forma “clave: valor”

Ejemplo de texto en YAML:

---
Routers:
- Hostname: R1
  Vendor: Cisco
  Id: '1'
- Hostname: R2
  Vendor: Huawei
  Id: '2'

Leer datos en YAML desde un archivo con Python

Una de las formas más facil de parsear datos en YAML hacia Python es a tráves del módulo “yaml”.

Tomemos el texto del ejemplo anterior y guardemoslo en un archivo llamado “yaml_data.txt”. A continuación les muestro un código simple utilizando el módulo de python “yaml” para leer los datos en yaml e imprimirlos en pantalla en como estructura de diccionario de Python.

import yaml
with open('yaml_data.txt') as yaml_data:
    yaml_parsed = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(yaml_parsed)
print(type(yaml_parsed))

Veremos en la primera línea los datos en un diccionario de Python. Y en la según línea confirmamos que el tipo de datos es un diccionario.

{'Routers': [{'Hostname': 'R1', 'Vendor': 'Cisco', 'Id': '1'}, {'Hostname': 'R2', 'Vendor': 'Huawei', 'Id': '2'}]}
<class 'dict'>

Conclusión

Realmente no es difícil parsear datos en los formatos JSON, XML y YAML en Python. Al utilizar los módulos y métodos que mostramos, se pueden estructurar los datos en un diccionario. Ese diccionario se puede usar como diccionario, o bien se pueden pasar los datos a otros objetos.

Espero que hayas encontrado este tutorial de utilidad. Cualquier pregunta, duda o comentario, favor comentar mas abajo.

By Michael Alvarez

Deja un comentario

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