Bienvenidos sean a este post, hoy veremos como manejar algunos tipos de IO.
Cuando hablamos de IO nos referimos a INPUT/OUTPUT o lo mismo que decir Entrada/Salida y esto se refiere a la comunicacion entre dos ordenadores, entre el CPU y otro componente, entre Buffers, en fin para la informatica hablar de I/O (como suele aparecer) se refiere a la comunicacion entre un elemento y otro elemento sin importar si es interno, externo o sobre una red, por eso en este post cubriremos un par de las que podemos realizar en python.
Usar una secuencia en memoria
Para este tema utilizaremos a io.StringIO el cual crea una secuencia en memoria, para entender el concepto vamos a crear un ejemplo, para ello primero importaremos este modulo:
>>> import io
Esta nos permitira acceder a todos los elementos en io, nuestro siguiente paso sera crear el objeto que usaremos para trabajar:
>>> flujo = io.StringIO()
Con nuestro nuevo objeto creado vamos a escribir en el mismo de dos formas distintas:
>>> flujo.write('Aprendiendo en tinchicus.com.\n')
30
>>> print('Conviertete en un Pythonist!', file=flujo)
>>>
En la primer linea escribimos por medio de write dentro del objeto que generamos, la siguiente linea es por medio de print pero despues del texto le informamos que use a file y lo direccione al objeto creado, por lo tanto tenemos ambos textos dentro del objeto, vamos a generar el siguiente objeto:
>>> contenido = flujo.getvalue()
Aqui almacenaremos el valor que agregamos anteriormente por medio de getvalue, para ver si es verdad usemos la siguiente linea:
>>> print(contenido)
Aprendiendo en tinchicus.com.
Conviertete en un Pythonist!
>>>
Le decimos que imprima el contenido y vemos que funciono perfectamente, por ultimo debemos cerrar el objeto llamado flujo para liberarlo y liberar memoria:
>>> flujo.close()
Vamos a transformar el codigo anterior para ser utilizado por with para garantizarnos su cierre tal como vimos al manejar archivos:
>>> with io.StringIO() as flujo:
... flujo.write('Aprendiendo en tinchicus.com.\n')
... print('Conviertete en un Pythonist!', file=flujo)
... contenidos = flujo.getvalue()
... print(contenidos)
...
30
Aprendiendo en tinchicus.com.
Conviertete en un Pythonist!
>>>
Como pueden ver trabaja de la misma forma que antes, tambien with como hemos visto anteriormente en los posts anteriores, despues el contenido es el mismo al anterior pero nos garantizamos que el mismo se cierre al terminar el with, con esto vimos como podemos generar un objeto que genera un lugar en memoria y lo podemos usar para almacenar temporalmente hasta que lo cerremos, pasemos al siguiente tema.
Haciendo requests de HTTP
Aqui veremos como crear requests contra un servidor HTTP y poder obtener la informacion contra este, para poder hacer esta accion utilizaremos la libreria requests que fue creada por Kenneth Reitz y tambien nos comparte una pagina para hacer varios requests interesantes, para entender este concepto vamos a crear un ejemplo, primero importaremos la libreria:
>>> import requests
Con nuestra libreria importada procedamos a crear un diccionario donde guardaremos valores que son enviados cuando hacemos una conexion por medio de HTTP:
>>> urls = {
... 'get' : 'https://httpbin.org/get?title=learn+python+programming',
... 'headers' : 'https://httpbin.org/headers',
... 'ip' : 'https://httpbin.org/ip',
... 'user-agent' : 'https://httpbin.org/user-agent',
... 'UUID' : 'https://httpbin.org/uuid',
... }
>>>
Para este caso vamos a utilizar el dominio:
https://httpbin.org
Para obtener los distintos valores que se intercambian al momento de hacer una conexion o request a un servidor http, estos los almacenaremos en claves que identifican cada uno de los valores, para nuestro siguiente paso vamos a definir una funcion para obtener ese contenido:
>>> def get_contenido(titulo, url):
... respuesta = requests.get(url)
... print(f'Respuesta de {titulo}')
... print(respuesta.json())
...
>>>
Recibira dos valores, uno para el titulo (clave) y otro con una url para conectarse, dentro del bloque crearemos un nuevo objeto llamado respuesta donde usaremos a requests para que obtenga el dato por medio de la url pasada, luego imprimiremos el titulo para identificar el valor, por ultimo mostraremos el valor que obtuvimos de la url con respuesta y JSON para convertirlo, vamos a crear el bloque de codigo que ejecutara esta funcion:
>>> for titulo, url in urls.items():
... get_contenido(titulo, url)
... print('-' * 40)
...
Basicamente extraeremos los dos datos de urls y pasaremos por todos los elementos gracias a items, estos datos los pasamos a la funcion y despues usaremos una opcion muy interesante como es repetir 40 veces el guion para separar entre los distintos que obtendremos, veamos su salida:
Respuesta de get
{'args': {'title': 'learn python programming'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0', 'X-Amzn-Trace-Id': 'Root=1-6079086d-55412c1350051f3948acc766'}, 'origin': '181.94.202.150', 'url': 'https://httpbin.org/get?title=learn+python+programming'}
----------------------------------------
Respuesta de headers
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0', 'X-Amzn-Trace-Id': 'Root=1-6079086e-6e8cd7a9784a997b4ed24892'}}
----------------------------------------
Respuesta de ip
{'origin': '181.94.202.150'}
----------------------------------------
Respuesta de user-agent
{'user-agent': 'python-requests/2.21.0'}
----------------------------------------
Respuesta de UUID
{'uuid': '9fb1e895-6cf9-4a5b-a5c0-97672af28bc2'}
----------------------------------------
Toda esta informacion es la que pasa el protocolo HTTP cada vez que efectuamos una conexion, obviamente para nosotros es completamente innecesaria pero algunas veces necesitaremos saber algunos de estos para verfiicaciones y/o completar algun campo pero sobre esto ahondaremos mas adelante cuando llegue el momento de trabajar con entornos web lo cual sera mucho pero mucho mas adelante.
En resumen, hoy hemos visto como trabajar con elementos de Entrada/Salida, primero hemos visto como trabajar con un elemento IO de cadena (StringIO) pero internamente en memoria, hemos visto las formas de cargar informacion en este y como obtenerlo, despues vimos como trabajar con los requests a paginas webs, viendo como podemos obtener informacion desde un servidor, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
