Formateando un diccionario como JSON
# coding: utf-8
import json
data = {"Fruteria": [ {"Fruta": [ {"Nombre":"Manzana","Cantidad":10}, {"Nombre":"Pera","Cantidad":20}, {"Nombre":"Naranja","Cantidad":30} ] }, {"Verdura": [ {"Nombre":"Lechuga","Cantidad":80}, {"Nombre":"Tomate","Cantidad":15}, {"Nombre":"Pepino","Cantidad":50} ] } ]}
#Nos imprime en pantalla data como un tipo de dato nativo.
print 'DATA:', str(data)
#Nos devuelve el String con el JSON
data_string = json.dumps(data) # --> Analiza el dato como JSON
print 'JSON:', data_string
El resultado está codificado como UTF-8. Para decodificarlo como UNICODE, añadir:
decoded = json.loads(data_string)
print 'DECODIFICADO:', decoded
El elemento original data, el codificado como JSON y el vuelto a decodificar
no son iguales. Añade el código siguiente y cambia,
data por
data_string y por
decoded. Analiza y piensa en lo que has obtenido.
tab = "-" * 3
for clave, elemento in data.items():
# --> elemento es un diccionario, luego la clave es Fruteria, y elemento es el resto
print tab,clave
# print elemento # -> Imprimiría una lista de DOS elementos
tab += tab
for i in elemento: # -> recuerda, elemento es una lista. Tiene dos elementos diccionarios
for clave, j in i.items():
print tab, clave # --> Saca las claves, "Fruta" y "verdura
# print j # -> Imprimiría dos listas
for k in j:
# --> print k, cada "k" es un diccionario
for clave, l in k.items():
print tab,tab,clave, ": ", l
De hecho, al escribir nosotros la variable
data, hemos creado un objeto JSON, compuesto por diccionarios y listas anidados. Al usar la orden json.dumps(), el objeto data_string es codificado como una simple cadena de texto, y tratada como tal. Al volver a decodificarla , la vuelve a convertir a objeto.
¿Qué importancia tiene? Pues que al guardar un objeto JSON en un fichero lo tenemos que hacer como texto... Y al revés, al recuperarlo lo tengo que extraer como texto y convertirlo a objeto.
Guardar objeto JSON
# coding: utf-8
import json
data = {"Frutería": [ {"Fruta": [ {"Nombre":"Sandía","Cantidad":10}, {"Nombre":"Pera","Cantidad":20}, {"Nombre":"Naranja","Cantidad":30} ] }, {"Verdura": [ {"Nombre":"Lechuga","Cantidad":80}, {"Nombre":"Tomate","Cantidad":15}, {"Nombre":"Pepino","Cantidad":50} ] } ]}
data_string = json.dumps(data, ensure_ascii=False) # --> Ensure ascci False ASEGURA guardar en UTF-8
archivo = open("fruteria.txt","w")
archivo.write(data_string.encode("utf-8")) # --> Ensure ascci False ASEGURA guardar en UTF-8 JUNTO CON codificar en UTF-8
archivo.close()
Recuperar objeto JSON
# coding: utf-8
import json
archivo = open("fruteria.txt","r")
data_string = archivo.read()
archivo.close()
# --> Obtenido como cadena de texto
print data_string
data = json.loads(data_string)
tab = "-" * 3
for clave, elemento in data.items():
# --> elemento es un diccionario, luego la clave es Fruteria, y elemento es el resto
print tab,clave
# print elemento # -> Imprimiría una lista de DOS elementos
tab += tab
for i in elemento: # -> recuerda, elemento es una lista. Tiene dos elementos diccionarios
for clave, j in i.items():
print tab, clave # --> Saca las claves, "Fruta" y "verdura
# print j # -> Imprimiría dos listas
for k in j:
# --> print k, cada "k" es un diccionario
for clave, l in k.items():
print tab,tab,clave, ": ", l
= = =
Cómo presentar los datos de un objeto JSON pasado a cadena de texto
# coding: utf-8
import json
data = {"Frutería": [ {"Fruta": [ {"Nombre":"Sandía","Cantidad":10}, {"Nombre":"Pera","Cantidad":20}, {"Nombre":"Naranja","Cantidad":30} ] }, {"Verdura": [ {"Nombre":"Lechuga","Cantidad":80}, {"Nombre":"Tomate","Cantidad":15}, {"Nombre":"Pepino","Cantidad":50} ] } ]}
desordenado = json.dumps(data)
ordenado = json.dumps(data, sort_keys=True) # --> Ordena por índices: Cantidad primero, nombre después, pero no por valores.
ordenado2 = json.dumps(data, sort_keys=True, indent=1) # --> Los presenta de una forma más legible.
compacto = json.dumps(data, separators=(',',':')) #-> quita los espacios. Ahorra bytes en los ficheros.
print 'JSON:', desordenado,"\n"
print 'SORT:', ordenado,"\n"
print 'SORT2:', ordenado2,"\n"
print 'COMPACTO:', compacto,"\n"
print 'UNSORTED MATCH:', desordenado == ordenado
print 'SORTED MATCH :', ordenado == ordenado2
= = =
¿Qué es MySQL?
MySQL
es un gestor de bases de datos relacionales muy usado por páginas web
en todo el mundo para gestionar sus datos, desde la misma Wikipedia,
hasta Facebook y Youtube.
Su uso suele ser online, y se encuentra
asociado al desarrollo de lenguajes de progrmación en el lado del
servidor como PHP. MySQL funciona bajo varias plataformas, aunque
nosotros la solemos utilizar en Linux. Por ejemplo, el servidor donde
está alojado nuestra plataforma Moodle utiliza P.H.P. 5.5.9, MySQL
5.5.47 y Apache 2.4.7 como servidor de páginas web.
Su potencia y rapidez, sobre todo en la
lectura de datos, lo convierte en un gestor rápido adecuado para
Internet. También su uso es fácil, no demasiado complejo de aprender. Se
reduce al estudio de secuencias SQL.
= = =
Instalando MySQL (y el servidor Apache y PHP en LINUX)
Manejo de MySQL
= = =
MySQL y Python
Python
es capaz de manejar datos en MySQL. Para ello, antes de empezar,
instala (si no lo tienes) la librería estándar de python para manejar
bases de datos mysql.
sudo apt-get install python-mysqldb
Acceso a una base de datos MySQL en mi propio equipo (localhost)
Escribe el siguiente código. Para ello tendrás que instalar antes la base de datos callejero_madrid e importar los datos de la tabla callejero: descarga el fichero callejero_madrid.sql,
crear en Phpmyadmin una base de datos llamada callejero_madrid y dentro
de ella, usando la utilidad IMPORTAR, recuperar los datos.
# coding: utf-8
import MySQLdb
# datos IMPRESCINDIBLES de conexión
DB_HOST = 'localhost' # -> servidor
DB_USER = 'root' # -> usuario administrador o con permisos GRANT
DB_PASS = 'mipassword' # -> contraseña de usuario
DB_NAME = 'callejero_madrid' # -> Nombre de la base de datos
# Función que conecta y ejecuta una consulta
def run_query(query=''):
datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME]
conn = MySQLdb.connect(*datos,charset='utf8') # Conectar a la base de datos, con el juego de caracteres UTF-8
cursor = conn.cursor() # Crear un cursor
cursor.execute(query) # Ejecutar una consulta
if query.upper().startswith('SELECT'):
data = cursor.fetchall() # Traer los resultados de un select
else:
conn.commit() # Hacer efectiva la escritura de datos
data = None
cursor.close() # Cerrar el cursor
conn.close() # Cerrar la conexión
return data
# programa principal
datos = run_query("SELECT Literal from callejero LIMIT 100") # -> Nombre de una tabla de la base de datos.
# print datos
for i in datos:
print i[0]
Pero usando SQL no sólo se pueden leer datos...
También se pueden insertar... En el programa principal modifica por
# programa principal
insertar = "INSERT INTO `callejero_madrid`.`callejero` (`Codigo de via`, `Clase de la via`, `Particula de la via`, `Nombre de la via`, `Estado de la via`, `Tipo de denominacion de la via`, `Distritos atravesados (sólo vias historicas)`, `Literal`, `Fecha del alta de la denominacion de via`, `Fecha del baja de la denominación de via`) VALUES ('127 ', 'CALLE', '', 'Inventada por mí', 'Vigente', 'Pleno', '', 'Calle Inventada por mí', '2015-11-11', '')"
run_query(insertar)
O se puede seleccionar un registro por un determinado criterio de búsqueda...
# programa principal
buscar = "SELECT * FROM `callejero` WHERE `Nombre de la via` LIKE '%Marañón%' "
datos = run_query(buscar)
for i in datos:
print i[4]
El resto del tutorial entraría en el apasionante pero difícil tema de hacer páginas web con Python. Yo recomendaría previamente el estudio de tecnologías como HTML, CSS, PHP, Javascript y JQuery.