10 truques de python que serão úteis para os seus scripts

Olá! já há algum tempo que não escrevemos sobre píton, por isso hoje trazemos-lhe estes 10 truques de python que serão úteis para os seus scripts.

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

Lembre-se que se gostar dos nossos artigos pode comentá-los e agradecemos-lhe por partilhá-los nas redes sociais para nos ajudar a chegar a mais pessoas.

Vamos começar!

1. Ler e escrever ficheiros GZip

Por vezes precisamos de criar arquivos GZip de um ficheiro maior ou podemos ter necessidade de transferir dados. Esta é a forma mais fácil de criar ficheiros GZip. É como criar um ficheiro de texto mas importar o módulo gzip:

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

A sua leitura é tão fácil, assim como a sua escrita é a mesma forma de trabalhar que na criação de ficheiros com pitão:

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

2. Criar ficheiro tar.gz

Como no exemplo anterior, vamos criar um ficheiro GZip mas a partir de um directório em vez de a partir de um ficheiro. Neste exemplo vamos criar um ficheiro tar.gz no directório home do utilizador actual, incluindo no ficheiro o directório .ssh que também se encontra no directório home do utilizador 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 a palavra-passe na consola

Neste exemplo mostramos como esconder a palavra-passe quando solicitada num dos nossos scripts. Isto é útil para evitar que seja exibido. Comportar-se-á exactamente como os comandos passwd ou su ou sudo ao pedir a palavra-passe.

O código é o seguinte:

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

Seria exibido o seguinte:

ocultar_password

4. Executar comandos com pexpectat

Este módulo é a versão python do expect. Basicamente é capaz de Executar um comando e, de acordo com a saída do comando, introduzir um texto na consola. Isto é válido quando se utilizam comandos que requerem um timeout para introduzir parâmetros como passwd ou ssh. Desta forma pode completar a execução do comando correctamente introduzindo os parâmetros necessários, no exemplo mostraremos como executar o SSH introduzindo a password do hospedeiro alvo com 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)

O que veríamos na implementação seria o seguinte:

pexpect1

pexpect2

E o ficheiro de registo seria:

pexpect log

5. Codificar e descodificar um binário de base64 por chunks

Estes códigos permitem codificar e descodificar ficheiros na base64, é útil para transferir grandes ficheiros ou para transferir ficheiros binários ou armazenar assinaturas de vírus, etc:

A forma de codificá-lo seria a seguinte, na qual estamos a codificar um binário do comando ping armazenado em /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 pode ver no código acima, abre os ficheiros de origem e de destino. Lê um bloco do ficheiro de origem, codifica cada bloco e guarda-o no ficheiro de destino.

No próximo bloco de código, faz exactamente o contrário. Ou seja, abre o ficheiro codificado, descodifica-o e escreve para o ficheiro alvo. Tudo isto bloco a bloco.

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 bloco de código ajuda a ver se um website tem problemas. Neste caso, só é verificado durante 10 minutos, mas ao afinar o código pode ser verificado infinitamente:

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. Voz a partir de texto

Infelizmente ainda não tenho uma alternativa para o linux, só tenho este código disponível para as janelas.

Este código toca o texto passado como um parâmetro como um som:

#!/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. Reimportação de um modulo

Por vezes um módulo tem de ser recarregado em tempo de execução, isto é conseguido com:

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. Remover caracteres não alfanuméricos

Este código substitui os caracteres não alfanuméricos pelo carácter da sua escolha, este pode ser utilizado, por exemplo, como filtro para palavras-passe:

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

10. Remover itens vazios de uma lista

Por vezes, quando substituímos elementos de uma lista ou dividimos um texto, podemos gerar elementos de lista vazia na forma: [”]. Isto pode ser resolvido através da remoção destes elementos com o seguinte 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 

Aqui podemos ver como funciona:

filtro_vacio

É tudo por hoje. Se gostou ou quer mais artigos como este, deixe a sua opinião num comentário e/ou partilhe nas suas redes sociais.
Até logo!

Deixe um comentário