Tabla de contenido
- 1 1. Ler e escrever ficheiros GZip
- 2 2. Criar ficheiro tar.gz
- 3 3. Ocultar a palavra-passe na consola
- 4 4. Executar comandos com pexpectat
- 5 5. Codificar e descodificar um binário de base64 por chunks
- 6 6. Comprobar web
- 7 7. Voz a partir de texto
- 8 8. Reimportação de um modulo
- 9 9. Remover caracteres não alfanuméricos
- 10 10. Remover itens vazios de uma lista
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.
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:
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:
E o ficheiro de registo seria:
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:
É 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!