10 trucos de python que te serán utiles para tus scripts

¡Hola! Hacía tiempo que no escribíamos sobre python, así que hoy traemos estos 10 trucos de python que te serán útiles para tus scripts.

10 trucos de python que te serán utiles para tus scripts

Recuerda que si te gustan nuestros artículos puedes comentar en ellos y te agradecemos que los compartas en las redes sociales para hacer que lleguemos a mas gente.

¡Empecemos!

1. Leer y escribir ficheros GZip

En ocasiones tenemos que crear ficheros GZip de algún fichero mas grande o es posible que tengamos que transferir datos. Esta es la forma más sencilla de crear ficheros GZip. Es como crear un fichero de texto pero importando el módulo gzip:

f = gzip.open(indexpath, 'rb')
import gzip
contenido = "Texto"
f = gzip.open(indexpath, 'rb')
data = f.read()
f.close()

Para leerlo es exactamente igual de fácil, al igual que en las escritura es la misma forma de de trabajar que cuando creamos ficheros con python:

import gzip
f = gzip.open(indexpath, 'rb')
data = f.read()
f.close()

2. Crear fichero tar.gz

Al igual que en el ejemplo anterior crearemos un fichero GZip pero a partir de un directorio en vez de a partir de a partir de un fichero. En este ejemplo crearemos un fichero tar.gz en el directorio home del usuario actual incluyendo en el fichero el directorio .ssh que se encuentra también en el directorio home del usuario actual:

from shutil import make_archive
import os
archive_name = os.path.expanduser(os.path.join('~', 'miarchivo'))
root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
make_archive(archive_name, 'gztar', root_dir)

3. Ocultar el password al pedirlo por consola

En este ejemplo enseñamos como ocultar el password al pedirlo por consola en uno de nuestros scripts. Esto es útil para evitar que se muestre. Se comportará exactamente como lo hace los comandos passwd o su o sudo al pedir la password.

El código es el siguiente:

import getpass
usuario = raw_input("Introduce usuario: ")
password = getpass.getpass("Introduce password: ")
print(usuario, password)

Se mostraría lo siguiente:

ocultar_password

4. Ejecutar comandos con pexpect

Este módulo es la versión para python de expect. Básicamente es capaz de Ejecutar un comando y según la salida del comando introducir un texto en la consola. Esto es válido al utilizar comandos que requieren de un tiempo de espera para introducir parámetros como por ejemplo passwd o ssh. De esta forma se puede completar la ejecución del comando de forma correcta introduciendo los parámetros necesarios, en el ejemplo mostraremos como ejecutar SSH introduciendo la contraseña dell host de destino con pexpect:

import pexpect
import time
cmd = "ssh root@192.168.1.165"
child = pexpect.spawn(cmd)
child.expect('password:', timeout=10)
child.sendline(PASSWORD)
time.sleep(5)
child.sendline("ping -c1 192.168.1.1\n")
time.sleep(5)
child.sendline("\n")
fout = file('/tmp/texto-192.168.1.165','w')
child.logfile = fout
time.sleep(5)
child.expect(pexpect.EOF)

Lo que veríamos en la ejecución sería lo siguiente:

pexpect1

pexpect2

Y el fichero de log sería:

pexpect log

5. Codificar y decodificar un binario en base64 por chunks

Estos códigos permiten codificar y decodificar ficheros en base64, es útil para transferir ficheros de gran tamaño o para transferir ficheros binarios o guardar firmas de virus, etc:

La forma de codificarlo sería la siguiente, en la cual estamos codificando un binario del comando ping guardado en /tmp:

import codecs
import binascii

byte = "1"
in_file = open("/tmp/ping","rb")
out_file = open("/tmp/ping.b64","wb")
while byte != "":
    byte = in_file.read(128)
    encode = codecs.encode(binascii.b2a_base64(byte),"base64")
    out_file.write("__INICIO__" + encode[0:(len(encode)-2)] )
in_file.close()
out_file.close()

Como se puede ver en el código anterior, se abre el fichero de origen y el de destino. Lee un bloque del fichero de origen, codifica cada el bloque y lo guarda en el fichero de destino.

En el siguiente bloque de código, hace justo lo contrario. Es decir abre el fichero codificado, lo decodifica y escribe en el fichero de destino. Todo esto bloque a bloque.

import codecs
import binascii

byte = "1"
in_file = open("/tmp/ping.b64","rb")
out_file = open("/tmp/ping.devuelta","wb")
count = 0 
while byte != "":
    byte = in_file.read(244)
    print byte
    if len(byte) != 244:
        byte = byte[0:len(byte)-1]
    if byte[0:10] == "__INICIO__": 
        byte = byte.replace("__INICIO__","")
        print "Entra1"
        out_file.write(binascii.a2b_base64(codecs.decode(byte+"=","base64")))
    else:
        bytes = byte.split("__INICIO__")
        for b in bytes:
            print b
            out_file.write(binascii.a2b_base64(codecs.decode(b+"==","base64")))
in_file.close()
out_file.close()

6. Comprobar web

Este bloque de código ayuda a ver si una web tiene problemas. En este caso se comprueba solo durante 10 minutos pero retocando el código se puede comprobar de forma infinita:

import requests,time,sys

def getWeb(url):
    r = requests.get(url)
    return int(r.status_code)

def main():
    url = "http://google.es" #sys.argv[1]
    counter = 0
    status = getWeb(url)
    print ("The website returns status code: {0}".format(status))
    while counter<10 and status==500:
        status = getWeb(url)
        print ("The website returns status code: {0}".format(status))
        time.sleep(60)
        counter += 1
    if status==500:
        print ("The website is down")
    elif status==200:
        print ("The website is OK")
    else:
        print ("The website is not returning error code 500 but is not OK")

if __name__=="__main__":
    main()

 

7. Sacar voz a partir de un texto

Por desgracia todavía no tengo una alternativa para linux, solo tengo disponible este código para windows.

Este código reproduce el texto que se le pasa como parámetro como un sonido:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import win32com.client

speaker = win32com.client.Dispatch("SAPI.SpVoice")

while True:
    print("Introduzca el texto a reproducir:")
    s = raw_input()
    speaker.Speak(s)

 

8. Reimportar modulo

En ocasiones se tiene que recargar un módulo en tiempo de ejecución, esto se consigue con:

reload(modulo)

Con esta linea podemos hacer que si hemos creado un servicio, este recargue modulos en tiempo de ejecución, para recargar posibles cambios en módulos o plugins sin reiniciar el servicio.

9. Eliminar carácteres no alfanumericos

Este código reemplaza los carácteres no alfanumericos por el carácter que deseemos, esto puede servirnos por ejemplo de filtro para passwords:

import re
s = re.sub('[^0-9a-zA-Z]+', '*', s)

10. Eliminar elementos vacíos de una lista

A veces cuando reeplazamos elementos de una lista o hacemos un split de un texto puede pasar que se nos generen elementos de la lista vacíos en decir: [»]. Esto puede solucionarse eliminando estos elementos con el siguiente código:

texto="Prueba con     espacios  multiples"
str_list=texto.split(" ")
#este es el mas rapido
str_list = filter(None, str_list) # fastest
#O podemos utilizar este:
str_list = filter(bool, str_list) # fastest
#Este es otra opcion:
str_list = filter(len, str_list) # a bit slower
#O este otro:
str_list = filter(lambda item: item, str_list) # slower than list 

Aquí podemos ver como funciona:

filtro_vacio

Esto ha sido todo por hoy. Si te ha gustado o quiere más articulos como este artículo deja tu opinión en un comentario y/o comparte en tus redes sociales.
¡Nos vemos!

Deja una respuesta