Automatize Tarefas com Python e IA: Guia Completo
Aprenda a automatizar tarefas repetitivas combinando Python com modelos de IA: e-mails, relatórios, organização de arquivos, análise de documentos e mais.
Introdução
Automação é uma das aplicações mais práticas e imediatas de Python. Quando combinamos scripts de automação com modelos de Inteligência Artificial, o potencial se multiplica: podemos automatizar tarefas que antes exigiam julgamento humano, como classificar e-mails, resumir documentos, gerar relatórios inteligentes e organizar arquivos por conteúdo.
Neste guia, vamos construir múltiplos scripts de automação que você pode adaptar para o seu dia a dia e ganhar horas de produtividade toda semana.
Pré-requisitos
pip install openai watchdog python-docx openpyxl Pillow pytesseract
pip install schedule python-dotenv jinja2 markdown
1. Organizador Inteligente de Arquivos
Este script monitora uma pasta e organiza os arquivos automaticamente, usando IA para classificar documentos pelo conteúdo:
"""
Organizador Inteligente de Arquivos.
Monitora uma pasta e organiza arquivos por tipo e conteúdo.
"""
import os
import shutil
from pathlib import Path
from datetime import datetime
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import logging
import time
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s"
)
logger = logging.getLogger(__name__)
# Mapeamento de extensões para categorias
CATEGORIAS = {
"imagens": {".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".bmp"},
"documentos": {".pdf", ".doc", ".docx", ".txt", ".odt", ".rtf"},
"planilhas": {".xls", ".xlsx", ".csv", ".ods"},
"apresentacoes": {".ppt", ".pptx", ".odp"},
"videos": {".mp4", ".avi", ".mkv", ".mov", ".wmv"},
"audio": {".mp3", ".wav", ".flac", ".aac", ".ogg"},
"codigo": {".py", ".js", ".ts", ".html", ".css", ".java", ".cpp", ".rs"},
"compactados": {".zip", ".rar", ".7z", ".tar", ".gz"},
"dados": {".json", ".xml", ".yaml", ".yml", ".sql", ".db"},
}
def get_categoria(extensao: str) -> str:
"""Retorna a categoria baseada na extensão do arquivo."""
ext = extensao.lower()
for categoria, extensoes in CATEGORIAS.items():
if ext in extensoes:
return categoria
return "outros"
class FileOrganizer(FileSystemEventHandler):
"""Handler que organiza arquivos quando são criados."""
def __init__(self, source_dir: str, target_dir: str):
self.source_dir = Path(source_dir)
self.target_dir = Path(target_dir)
self.target_dir.mkdir(parents=True, exist_ok=True)
def on_created(self, event):
if event.is_directory:
return
filepath = Path(event.src_path)
# Ignorar arquivos temporários
if filepath.name.startswith(".") or filepath.name.startswith("~"):
return
# Esperar o arquivo terminar de ser copiado
time.sleep(1)
self._organize_file(filepath)
def _organize_file(self, filepath: Path):
"""Move o arquivo para a pasta da categoria correta."""
categoria = get_categoria(filepath.suffix)
# Criar subpasta com data
data_str = datetime.now().strftime("%Y-%m")
dest_dir = self.target_dir / categoria / data_str
dest_dir.mkdir(parents=True, exist_ok=True)
# Resolver conflitos de nome
dest_path = dest_dir / filepath.name
counter = 1
while dest_path.exists():
stem = filepath.stem
dest_path = dest_dir / f"{stem}_{counter}{filepath.suffix}"
counter += 1
shutil.move(str(filepath), str(dest_path))
logger.info(f"📁 {filepath.name} → {categoria}/{data_str}/")
def monitor_folder(source: str, target: str):
"""Inicia o monitoramento de uma pasta."""
organizer = FileOrganizer(source, target)
observer = Observer()
observer.schedule(organizer, source, recursive=False)
observer.start()
logger.info(f"👀 Monitorando: {source}")
logger.info(f"📂 Destino: {target}")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
# Uso: monitor_folder("~/Downloads", "~/Organizado")
2. Classificador de Documentos com IA
Agora vamos além das extensões — usando IA para entender o conteúdo dos documentos:
"""
Classificador de documentos por conteúdo usando IA.
Lê o texto dos arquivos e classifica automaticamente.
"""
from openai import OpenAI
from pathlib import Path
import os
import json
from docx import Document as DocxDocument
import csv
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def extract_text_from_file(filepath: Path) -> str:
"""Extrai texto de diferentes formatos de arquivo."""
ext = filepath.suffix.lower()
if ext == ".txt":
return filepath.read_text(encoding="utf-8", errors="ignore")
elif ext == ".docx":
doc = DocxDocument(str(filepath))
return "\n".join(para.text for para in doc.paragraphs)
elif ext == ".csv":
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
reader = csv.reader(f)
rows = list(reader)[:50] # Primeiras 50 linhas
return "\n".join(",".join(row) for row in rows)
elif ext in (".py", ".js", ".ts", ".java", ".html", ".css"):
return filepath.read_text(encoding="utf-8", errors="ignore")
return ""
def classify_document(texto: str) -> dict:
"""
Usa IA para classificar o conteúdo de um documento.
Returns:
Dict com categoria, subcategoria e descrição
"""
prompt = f"""Analise o seguinte trecho de documento e classifique-o.
Retorne um JSON com os campos:
- "categoria": categoria principal (ex: "financeiro", "técnico", "jurídico", "pessoal", "acadêmico")
- "subcategoria": subcategoria específica (ex: "contrato", "relatório", "código-fonte")
- "descricao": descrição breve de uma frase sobre o documento
- "importancia": "alta", "média" ou "baixa"
Trecho do documento:
{texto[:2000]}
Retorne APENAS o JSON válido, sem explicações."""
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "Você é um assistente especializado em organização e classificação de documentos."
},
{"role": "user", "content": prompt}
],
max_tokens=200,
temperature=0.1,
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
def organize_by_content(source_dir: str, target_dir: str):
"""Organiza arquivos de um diretório baseado no conteúdo."""
source = Path(source_dir)
target = Path(target_dir)
supported_extensions = {".txt", ".docx", ".csv", ".py", ".js", ".md"}
for filepath in source.iterdir():
if filepath.is_file() and filepath.suffix.lower() in supported_extensions:
texto = extract_text_from_file(filepath)
if len(texto) < 50:
continue
classificacao = classify_document(texto)
print(f"\n📄 {filepath.name}")
print(f" Categoria: {classificacao.get('categoria', 'N/A')}")
print(f" Subcategoria: {classificacao.get('subcategoria', 'N/A')}")
print(f" Importância: {classificacao.get('importancia', 'N/A')}")
# Mover para pasta da categoria
cat_dir = target / classificacao.get("categoria", "outros")
cat_dir.mkdir(parents=True, exist_ok=True)
dest = cat_dir / filepath.name
shutil.copy2(str(filepath), str(dest))
3. Gerador Automático de Relatórios
Cria relatórios profissionais a partir de dados usando IA para análise e narrativa:
"""
Gerador automático de relatórios com análise por IA.
Lê dados de planilhas/CSVs e cria relatórios em Markdown/HTML.
"""
from openai import OpenAI
from pathlib import Path
from datetime import datetime
import csv
import json
import os
from statistics import mean, median, stdev
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def load_csv_data(filepath: str) -> tuple[list[str], list[list[str]]]:
"""Carrega dados de um CSV."""
with open(filepath, "r", encoding="utf-8") as f:
reader = csv.reader(f)
headers = next(reader)
rows = list(reader)
return headers, rows
def calculate_statistics(headers: list, rows: list) -> dict:
"""Calcula estatísticas básicas dos dados numéricos."""
stats = {}
for i, header in enumerate(headers):
values = []
for row in rows:
try:
values.append(float(row[i].replace(",", ".")))
except (ValueError, IndexError):
continue
if values:
stats[header] = {
"media": round(mean(values), 2),
"mediana": round(median(values), 2),
"desvio_padrao": round(stdev(values), 2) if len(values) > 1 else 0,
"minimo": round(min(values), 2),
"maximo": round(max(values), 2),
"total": round(sum(values), 2),
"contagem": len(values)
}
return stats
def generate_analysis(stats: dict, context: str = "") -> str:
"""Usa IA para gerar análise narrativa dos dados."""
prompt = f"""Com base nas seguintes estatísticas de dados, gere uma análise
em português brasileiro com insights relevantes, tendências identificadas
e recomendações.
Estatísticas:
{json.dumps(stats, ensure_ascii=False, indent=2)}
Contexto adicional: {context or 'Dados gerais da empresa'}
Gere a análise com:
1. Resumo executivo (2-3 frases)
2. Principais insights (3-5 pontos)
3. Tendências identificadas
4. Recomendações
"""
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "Você é um analista de dados sênior que gera "
"relatórios profissionais e objetivos."
},
{"role": "user", "content": prompt}
],
max_tokens=1000,
temperature=0.3
)
return response.choices[0].message.content
def create_report(
csv_path: str,
output_path: str,
title: str = "Relatório de Análise de Dados",
context: str = ""
):
"""Cria relatório completo a partir de dados CSV."""
headers, rows = load_csv_data(csv_path)
stats = calculate_statistics(headers, rows)
analysis = generate_analysis(stats, context)
# Montar relatório em Markdown
report = f"""# {title}
**Data de geração:** {datetime.now().strftime("%d/%m/%Y às %H:%M")}
**Fonte de dados:** {Path(csv_path).name}
**Total de registros:** {len(rows)}
---
## Estatísticas dos Dados
"""
for coluna, valores in stats.items():
report += f"### {coluna}\n\n"
report += f"| Métrica | Valor |\n|---------|-------|\n"
for metrica, valor in valores.items():
report += f"| {metrica.replace('_', ' ').title()} | {valor} |\n"
report += "\n"
report += f"""---
## Análise e Insights
{analysis}
---
*Relatório gerado automaticamente por Inteligência em Código.*
"""
Path(output_path).write_text(report, encoding="utf-8")
print(f"✅ Relatório salvo em: {output_path}")
# Uso:
# create_report("vendas_2026.csv", "relatorio_vendas.md",
# title="Relatório de Vendas Q1 2026",
# context="Dados de vendas do primeiro trimestre")
4. Assistente de E-mail com IA
Script que analisa e-mails e gera respostas automáticas:
"""
Assistente de e-mail com IA.
Analisa e-mails recebidos e sugere/gera respostas.
"""
from openai import OpenAI
from dataclasses import dataclass
from enum import Enum
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
class Urgencia(str, Enum):
ALTA = "alta"
MEDIA = "média"
BAIXA = "baixa"
class Acao(str, Enum):
RESPONDER = "responder"
ENCAMINHAR = "encaminhar"
ARQUIVAR = "arquivar"
AGENDAR = "agendar"
@dataclass
class EmailAnalysis:
"""Resultado da análise de um e-mail."""
assunto: str
remetente: str
urgencia: Urgencia
acao_sugerida: Acao
resumo: str
resposta_sugerida: str
tags: list[str]
def analyze_email(
assunto: str, corpo: str, remetente: str
) -> EmailAnalysis:
"""
Analisa um e-mail e retorna classificação + resposta sugerida.
"""
prompt = f"""Analise o seguinte e-mail e retorne um JSON com:
- "urgencia": "alta", "média" ou "baixa"
- "acao": "responder", "encaminhar", "arquivar" ou "agendar"
- "resumo": resumo de 1-2 frases
- "tags": lista de tags relevantes (max 5)
- "resposta": sugestão de resposta profissional em português
E-mail:
De: {remetente}
Assunto: {assunto}
{corpo[:3000]}"""
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "Você é um assistente executivo eficiente. "
"Analise e-mails de forma objetiva e gere "
"respostas profissionais e cordiais."
},
{"role": "user", "content": prompt}
],
max_tokens=500,
temperature=0.3,
response_format={"type": "json_object"}
)
import json
data = json.loads(response.choices[0].message.content)
return EmailAnalysis(
assunto=assunto,
remetente=remetente,
urgencia=Urgencia(data.get("urgencia", "média")),
acao_sugerida=Acao(data.get("acao", "responder")),
resumo=data.get("resumo", ""),
resposta_sugerida=data.get("resposta", ""),
tags=data.get("tags", [])
)
# Exemplo de uso
analise = analyze_email(
assunto="Proposta de Parceria - Tech Solutions",
corpo="""Olá,
Somos da Tech Solutions e gostaríamos de propor uma parceria
para desenvolvimento conjunto de soluções de IA para o setor
financeiro. Temos experiência de 5 anos no mercado e atendemos
mais de 200 clientes.
Podemos agendar uma reunião para discutir os detalhes?
Atenciosamente,
Maria Silva
Diretora Comercial""",
remetente="maria.silva@techsolutions.com.br"
)
print(f"📧 Assunto: {analise.assunto}")
print(f"⚡ Urgência: {analise.urgencia}")
print(f"🎯 Ação: {analise.acao_sugerida}")
print(f"📝 Resumo: {analise.resumo}")
print(f"🏷️ Tags: {', '.join(analise.tags)}")
print(f"\n💬 Resposta sugerida:\n{analise.resposta_sugerida}")
5. Agendador de Tarefas Recorrentes
"""
Agendador de tarefas automatizadas com schedule.
Executa tarefas de automação em horários definidos.
"""
import schedule
import time
from datetime import datetime
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def tarefa_organizar_downloads():
"""Organiza a pasta Downloads a cada 30 minutos."""
logger.info("🗂️ Organizando Downloads...")
# Aqui usaria o FileOrganizer definido anteriormente
# organize_folder("~/Downloads", "~/Organizado")
logger.info("✅ Downloads organizados!")
def tarefa_gerar_relatorio_diario():
"""Gera relatório diário às 18h."""
logger.info("📊 Gerando relatório diário...")
# create_report("dados_hoje.csv", f"relatorio_{datetime.now():%Y%m%d}.md")
logger.info("✅ Relatório gerado!")
def tarefa_verificar_emails():
"""Verifica e classifica e-mails a cada hora."""
logger.info("📧 Verificando e-mails...")
# Integrar com IMAP para buscar novos e-mails
logger.info("✅ E-mails verificados!")
def tarefa_backup_dados():
"""Faz backup semanal dos dados."""
logger.info("💾 Iniciando backup semanal...")
# Copiar dados importantes para backup
logger.info("✅ Backup concluído!")
# Configurar agendamento
schedule.every(30).minutes.do(tarefa_organizar_downloads)
schedule.every().day.at("18:00").do(tarefa_gerar_relatorio_diario)
schedule.every(1).hours.do(tarefa_verificar_emails)
schedule.every().monday.at("02:00").do(tarefa_backup_dados)
def run_scheduler():
"""Executa o agendador em loop."""
logger.info("⏰ Agendador iniciado!")
logger.info("Tarefas configuradas:")
for job in schedule.get_jobs():
logger.info(f" → {job}")
while True:
schedule.run_pending()
time.sleep(60)
if __name__ == "__main__":
run_scheduler()
6. OCR Inteligente: Extraindo Texto de Imagens
"""
OCR com análise inteligente usando Tesseract + IA.
Extrai e interpreta texto de imagens e documentos escaneados.
"""
from PIL import Image
import pytesseract
from openai import OpenAI
from pathlib import Path
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def extract_text_from_image(image_path: str, lang: str = "por") -> str:
"""
Extrai texto de uma imagem usando OCR.
Args:
image_path: Caminho para a imagem
lang: Idioma para OCR (por=português, eng=inglês)
Returns:
Texto extraído da imagem
"""
image = Image.open(image_path)
# Pré-processamento para melhorar OCR
image = image.convert("L") # Escala de cinza
texto = pytesseract.image_to_string(image, lang=lang)
return texto.strip()
def analyze_document_image(image_path: str) -> dict:
"""
Extrai texto de imagem e analisa o conteúdo com IA.
Returns:
Dict com texto extraído, tipo de documento e dados estruturados
"""
texto = extract_text_from_image(image_path)
if not texto:
return {"erro": "Nenhum texto encontrado na imagem"}
prompt = f"""Analise o seguinte texto extraído via OCR de um documento.
Identifique o tipo de documento e extraia dados estruturados.
Texto do OCR:
{texto[:3000]}
Retorne JSON com:
- "tipo_documento": tipo identificado (nota fiscal, recibo, contrato, etc)
- "dados_extraidos": dicionário com campos relevantes encontrados
- "texto_corrigido": texto com correções de erros de OCR
- "confianca": "alta", "média" ou "baixa"
"""
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
max_tokens=500,
temperature=0.1,
response_format={"type": "json_object"}
)
import json
result = json.loads(response.choices[0].message.content)
result["texto_original_ocr"] = texto
return result
# Exemplo: processar todas as imagens de uma pasta
def process_document_folder(folder: str):
"""Processa todos os documentos escaneados de uma pasta."""
pasta = Path(folder)
extensoes = {".png", ".jpg", ".jpeg", ".tiff", ".bmp"}
resultados = []
for arquivo in pasta.iterdir():
if arquivo.suffix.lower() in extensoes:
print(f"\n📸 Processando: {arquivo.name}")
resultado = analyze_document_image(str(arquivo))
resultado["arquivo"] = arquivo.name
resultados.append(resultado)
tipo = resultado.get("tipo_documento", "desconhecido")
print(f" Tipo: {tipo}")
print(f" Confiança: {resultado.get('confianca', 'N/A')}")
return resultados
Conclusão
A combinação de Python com IA abre possibilidades enormes para automação de tarefas que antes exigiam intervenção humana constante. Neste tutorial, construímos seis ferramentas práticas:
- Organizador de arquivos com monitoramento em tempo real
- Classificador de documentos que entende o conteúdo via IA
- Gerador de relatórios com análise estatística e narrativa inteligente
- Assistente de e-mail que classifica e sugere respostas
- Agendador de tarefas para execução recorrente
- OCR inteligente para digitalizar e interpretar documentos
Cada script pode ser usado independentemente ou combinado em um sistema maior de automação pessoal ou empresarial.
Próximos Passos
- Integrar com APIs reais de e-mail (Gmail API, IMAP)
- Adicionar interface web com Streamlit para gerenciar automações
- Criar notificações via Telegram ou Slack quando tarefas são concluídas
- Implementar logging centralizado com ElasticSearch
- Adicionar testes automatizados para cada script
- Criar CLI com Click ou Typer para facilitar a execução