Saltar para o conteúdo
Automação com Python: Scripts que Resolvem Problemas Reais
Python

Automação com Python: Scripts que Resolvem Problemas Reais

25 de maio de 2026·Paulo Pereira

Por que Automatizar com Python?

Python tem o melhor ecossistema de automação: bibliotecas para qualquer tarefa, sintaxe clara e uma comunidade enorme. Se você repete algo mais de 3 vezes, vale automatizar.

Manipulação de Arquivos em Massa

from pathlib import Path
import shutil
from datetime import datetime

def organizar_downloads(pasta: Path):
    extensoes = {
        '.pdf': 'documentos',
        '.jpg': 'imagens', '.jpeg': 'imagens', '.png': 'imagens',
        '.mp4': 'videos', '.mov': 'videos',
        '.zip': 'compactados',
    }

    for arquivo in pasta.iterdir():
        if arquivo.is_file() and arquivo.suffix in extensoes:
            destino = pasta / extensoes[arquivo.suffix]
            destino.mkdir(exist_ok=True)
            shutil.move(str(arquivo), destino / arquivo.name)

organizar_downloads(Path.home() / "Downloads")

Planilhas Excel com openpyxl

import openpyxl
from openpyxl.styles import Font, PatternFill
from openpyxl.utils import get_column_letter

def gerar_relatorio(dados: list[dict], arquivo: str):
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "Relatório"

    cabecalhos = list(dados[0].keys()) if dados else []
    for col, cabecalho in enumerate(cabecalhos, 1):
        cell = ws.cell(row=1, column=col, value=cabecalho)
        cell.font = Font(bold=True, color="FFFFFF")
        cell.fill = PatternFill("solid", fgColor="1F4E79")

    for linha, item in enumerate(dados, 2):
        for col, chave in enumerate(cabecalhos, 1):
            ws.cell(row=linha, column=col, value=item.get(chave))

    # Auto-ajusta largura das colunas
    for col in range(1, len(cabecalhos) + 1):
        ws.column_dimensions[get_column_letter(col)].auto_size = True

    wb.save(arquivo)

Envio de E-mail com Relatório

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os

def enviar_relatorio(destinatario: str, assunto: str, arquivo: str):
    msg = MIMEMultipart()
    msg['From']    = os.environ['EMAIL_REMETENTE']
    msg['To']      = destinatario
    msg['Subject'] = assunto

    msg.attach(MIMEText("Relatório em anexo.", 'plain'))

    with open(arquivo, 'rb') as f:
        parte = MIMEBase('application', 'octet-stream')
        parte.set_payload(f.read())
    encoders.encode_base64(parte)
    parte.add_header('Content-Disposition', f'attachment; filename={os.path.basename(arquivo)}')
    msg.attach(parte)

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.login(os.environ['EMAIL_REMETENTE'], os.environ['EMAIL_SENHA'])
        server.send_message(msg)

Web Scraping com BeautifulSoup

import requests
from bs4 import BeautifulSoup
import pandas as pd

def scrape_noticias(url: str) -> list[dict]:
    headers = {'User-Agent': 'Mozilla/5.0'}
    resp    = requests.get(url, headers=headers, timeout=10)
    soup    = BeautifulSoup(resp.text, 'html.parser')

    noticias = []
    for artigo in soup.select('article.noticia'):
        titulo = artigo.select_one('h2').get_text(strip=True)
        link   = artigo.select_one('a')['href']
        data   = artigo.select_one('time')['datetime']
        noticias.append({'titulo': titulo, 'link': link, 'data': data})

    return noticias

# Salva em CSV
df = pd.DataFrame(scrape_noticias("https://exemplo.com"))
df.to_csv("noticias.csv", index=False, encoding='utf-8-sig')

Agendamento com schedule

import schedule
import time

def tarefa_diaria():
    dados = coletar_dados()
    gerar_relatorio(dados, "relatorio.xlsx")
    enviar_relatorio("gestor@empresa.com", "Relatório Diário", "relatorio.xlsx")
    print("Relatório enviado!")

schedule.every().day.at("08:00").do(tarefa_diaria)
schedule.every().monday.at("09:00").do(backup_semanal)

while True:
    schedule.run_pending()
    time.sleep(60)

CLI com Click

import click

@click.group()
def cli():
    pass

@cli.command()
@click.argument('pasta', type=click.Path(exists=True))
@click.option('--dry-run', is_flag=True, help='Apenas simula, sem mover arquivos')
def organizar(pasta, dry_run):
    """Organiza arquivos da PASTA por tipo."""
    if dry_run:
        click.echo(f"[DRY RUN] Organizaria: {pasta}")
    else:
        organizar_downloads(Path(pasta))
        click.echo(f"Pasta organizada: {pasta}")

if __name__ == '__main__':
    cli()

Conclusão

Python brilha na automação de tarefas repetitivas. Com as bibliotecas certas, você elimina horas de trabalho manual. Comece pelos pontos de dor do seu dia a dia — provavelmente há um script Python esperando para resolver cada um deles.