En este laboratorio veremos un ejemplo de como podemos trabajar con dos de los formatos de codificación de datos más extendidos. Por un lado, el formato CSV/TSV ofrece un soporte casi universal para trasvase rápido de datos entre diferentes sistemas (incluso desde o hacia programas de hoja de cálculo). Por otro lado, JSON es un formato muy popular en aplicaciones y APIs web.
En ambos casos, se encuentran soportados en Python mediante los módulos de la biblioteca standard csv y json. En el caso de JSON, veremos también bibliotecas alternativas para mejorar el rendimiento de carga y escritura.
El formato CSV es uno de los más sencillos para trasvasar datos entre diferentes programas, repositorios o bases de datos. Algunas de sus ventajas son:
Los problemas derivados de la ausencia de un estándar común bien definido pueden entorpecer la recuperación de datos. Por ejemplo, no existe un consenso sobre la representación de números con cifras decimales.
Sin embargo, el principal inconveniente del formato CSV es que necesitamos conocer de antemano el número de campos que contiene cada fila, así como el tipo de datos de cada campo para su correcta recuperación. Por ello, es muy importante contar con una descripción por separado del contenido de los archivos, o al menos con algunas líneas de ejemplo.
La biblioteca estándar de Python proporciona el módulo csv para facilitar la lectura y escritura de datos en este formato. Uno de los mejores tutoriales para aprender más sobre el tratamiento de datos CSV es csv – Comma-separated value files, que forma parte de la serie PyMOTW.
Dicho tutorial incluye:
Sniffer()
(incluida en el módulo csv
) para detección automática del formato.Para continuar nuestra práctica, vamos a utilizar el archivo sample_new_users.csv
(disponible en el repositorio del curso). Este archivo contiene una muestra del log de creación de nuevos usuarios de la Wikipedia en Escocés (lengua germánica).
Los campos son:
Escriba un programa en Python que cargue en memoria todos los datos del fichero sample_new_users.csv
y muestre el primer y el último registro contenido en el fichero, según su orden cronológico.
In [1]:
## ESPACIO PARA LA RESOLUCION DEL EJERCICIO
In [2]:
## ESPACIO PARA LA RESOLUCION DEL EJERCICIO
Como ya hemos comentado, JSON se creo como un estándar para intercambio de datos que fuese ligero, fácil de implementar y flexible. Su sintaxis es muy parecida a la de los diccionarios en Python, pues está basado en objetos, representados como parejas clave: valor
que van encerradas entre llaves. El documento JSON puede tener una estructura jerárquica, con objetos anidados en varios niveles.
Las claves son siempre de tipo string. Los valores puede ser individuales (strings, números, objetos serializados, etc.) o bien arrays de valores. Estos últimos son similares a las listas de Python, bues se encierran entre corchetes y permiten crear listas ordenadas de valores. Normalmente, los datos de tipo string se interpretan como cadenas de caracteres Unicode.
El formato JSON se ha convertido en un estándar muy frecuente para el trasvase de datos, especialmente en entornos web. Inicialmente asociado al lenguaje JavaScript, su relativa simplicidad y su capacidad para integrar fácilmente estructuras de datos anidadas con distintos formatos le convierten en un formato muy versátil en todo tipo de situaciones.
Un caso típico en el que se suele trabajar con datos en formato JSON es cuando consumimos información de una API, por ejemplo a través de una interfaz REST. El siguiente ejemplo muestra una consulta para recuperar datos de la API de Wikipedia en español. La consulta obtiene la revisión más reciente del artículo enciclopédico Tetramorium caespitum, incluyendo su contenido y metadatos adicionales como el autor del último cambio, la fecha en la que se editó esa revisión, y el comentario con el resumen de cambios que incluyó el autor:
A continuación, presentamos un programa muy simple que ilustra cómo podemos consumir dicha información en formato JSON en Python, utilizando para ello del módulo ujson
. También hacemos uso del módulo json
, incluido en la biblioteca estándar de Python, para imprimir los datos de forma más legible para un humano (pretty print):
In [7]:
import ujson
import json
import urllib
query = "".join(["http://es.wikipedia.org/w/api.php?action=query&prop=revisions",
"&titles=Tetramorium_caespitum&rvprop=timestamp|user|comment|content",
"&continue=&format=json"])
socket = urllib.urlopen(query)
data = socket.read()
# print data
json_data = ujson.loads(data)
print json.dumps(json_data, sort_keys=True, indent=4,
separators=(',', ': '))
Para practicar la obtención y escritura de datos en archivos JSON, vamos a utilizar como ejemplo los datos del juego de cartas Magic the Gathering. En particular, emplearemos los ficheros AllCards.json y AllSets.json.
La documentación sobre el contenido de los ficheros se pueden encontrar en los siguientes enlaces:
A continuación presentamos un ejemplo de código en Python para leer el fichero con todas las cartas de los diferentes juegos, imprimir el número total de cartas y los datos de una carta elegida de forma aleatoria:
In [13]:
import ujson
import json
import random
with open('AllCards.json') as f:
cards_dict = ujson.load(f)
cards_ids = cards_dict.keys()
print "Número total de cartas leidas: %d" % len(cards_ids)
print "Sacamos una carta aleatoria del mazo:"
single_card = cards_dict[random.choice(cards_ids)]
print json.dumps(single_card, sort_keys=True, indent=4,
separators=(',', ': '))
# Imprimir la carta de ejemplo en http://mtgjson.com/#cards
print json.dumps(cards_dict["Sen Triplets"], sort_keys=True, indent=4,
separators=(',', ': '))
Genere un programa en Python que lea el archivo AllSets.json
y calcule e imprima por pantalla los siguientes datos:
In [3]:
## ESPACIO PARA LA RESOLUCION DEL EJERCICIO
En este laboratorio hemos prácticado como podemos leer y escribir datos en dos de los formatos de representación más utilizados, CSV y JSON. Los aspectos tratados han sido:
csv
de la biblioteca estándar de Python para leer y escribir datos con ficheros CSV, considerando además las posibles peculiaridades de sintáxis (dialectos).ujson
para leer y escribir información en JSON de forma eficiente.
In [ ]: