23 de mayo de 2016

59. JSON y Python. MySQL y Python.

¿Qué es JSON?


JSON (JavaScript Object Notation) es un formato para el intercambios de datos, básicamente JSON describe los datos con una sintaxis dedicada que se usa para identificar y gestionar los datos. JSON nació como una alternativa a XML, el fácil uso en javascript ha generado un gran numero de seguidores de esta alternativa. Una de las mayores ventajas que tiene el uso de JSON es que puede ser leído por cualquier lenguaje de programación. Por lo tanto, puede ser usado para el intercambio de información entre distintas tecnologías.
  • En JSON se utiliza la sintaxis nombre/valor, separados por dos puntos "Manzanas": 20
  • Los tipos de valores a usar son string, numérico (int, float) , boolean, array [], objeto {} y null.
  • Un objeto JSON se identifica entre llaves: { "NombreFruta":"Manzana" , "Cantidad":20 }
  • Se pueden usar arrays, entre corchetes []
{
"Frutas": [
{ "NombreFruta":"Manzana" , "cantidad":10 }, 
{ "NombreFruta":"Pera" , "cantidad":20 }, 
{ "NombreFruta":"Naranja" , "cantidad":30 }
]
}
  • Por poner un ejemplo, tenemos un JSON formado por un array de dos elementos, los cuales a su vez son objetos, que a su vez son arrays de tres elementos
{"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}
   ]
  }
 ]
}
  • Para, por ejemplo, acceder a la cantidad de manzanas que tenemos, tengo que acceder al elemento 0 de "Frutería", y dentro de él al elemento 0 de "Fruta" y recuperar el valor de la etiqueta "Cantidad".
  • Con algo así:  json['Fruteria'][0]['Fruta'][0]['Cantidad']

Trabajando con JSON

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

Callejero de madrid

Utilidad. Determinar la codificación de un fichero y cambiarla.

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.

No hay comentarios:

Publicar un comentario