¿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.