🌗 ← Índice

🐍 Python P19 — Automação com pathlib + shutil


Data: 14/08/2026

Nível: Intermediário-Avançado (Mês 3 — Projetos Reais)




🎯 Objetivos





📖 Teoria


`pathlib.Path` — por que usar



from pathlib import Path

pasta = Path.home() / "Downloads"        # usa / para montar caminhos (funciona em Windows e Linux!)
print(pasta)

pasta_docs = Path("C:/Users/hugo/Documents")   # ou relativo

💡 `Path` funciona igual em Windows, Linux e macOS — sem se preocupar com `\` vs `/`.

Operações básicas



from pathlib import Path

caminho = Path("/tmp/meus_dados")

caminho.exists()          # existe?
caminho.is_file()         # é arquivo?
caminho.is_dir()          # é pasta?
caminho.mkdir(parents=True, exist_ok=True)   # cria pasta (e pais)
caminho.name              # 'meus_dados'
caminho.suffix            # '.txt' (extensão)
caminho.stem              # 'meus_dados' (sem extensão)
caminho.parent            # Path('/tmp')

Listar arquivos



from pathlib import Path

pasta = Path("/tmp")

# Todos os arquivos .txt
for arquivo in pasta.glob("*.txt"):
    print(arquivo)

# Todos os .py recursivamente
for arquivo in pasta.rglob("*.py"):
    print(arquivo)

# Todos os arquivos (não pastas)
for arquivo in pasta.iterdir():
    if arquivo.is_file():
        print(arquivo)

Ler e escrever



from pathlib import Path

arquivo = Path("/tmp/nota.txt")
arquivo.write_text("Olá, mundo!", encoding="utf-8")
conteudo = arquivo.read_text(encoding="utf-8")
print(conteudo)

# read_bytes / write_bytes para binários

Renomear, mover, apagar



from pathlib import Path

arquivo = Path("/tmp/nota.txt")
arquivo.rename("/tmp/nota_final.txt")

# Mover para outra pasta
Path("/tmp/nota_final.txt").replace("/tmp/backup/nota.txt")

arquivo.unlink()           # apagar arquivo (erro se não existir)
pasta.rmdir()              # apagar pasta VAZIA

`shutil` — cópias e backups



import shutil
from pathlib import Path
from datetime import datetime

origem = Path("/home/ubuntu/navidrome/music/")
destino = Path("/tmp/backup_musica")

shutil.copytree(origem, destino)              # copia pasta inteira
shutil.copy2(origem / "faixa.mp3", destino)   # copia arquivo (preserva metadados)
shutil.move(origem / "faixa.mp3", destino)    # move

Backup com timestamp



import shutil
from datetime import datetime
from pathlib import Path

origem = Path("/etc/nginx/sites-enabled")

data = datetime.now().strftime("%Y%m%d_%H%M%S")
destino = Path(f"/tmp/backup_nginx_{data}")

shutil.copytree(origem, destino)
print(f"Backup criado em {destino}")
# /tmp/backup_nginx_20260814_153045

Compactar (zip)



import shutil

shutil.make_archive("/tmp/backup_nginx", "zip", "/etc/nginx/sites-enabled")
# cria /tmp/backup_nginx.zip



✍️ Exercícios


  1. 1. Liste todos os arquivos `.md` do seu vault (`~/obsidian-estudos`) recursivamente e imprima nome + tamanho.
  2. 2. Crie uma pasta `organizado/` com subpastas `documentos/`, `imagens/`, `planilhas/` (use `mkdir(parents=True)`).
  3. 3. Crie um backup zip de uma pasta qualquer e verifique que o `.zip` existe.



🧪 Desafio


Crie um script organizador.py que organiza a pasta Downloads:



Teste: rode numa pasta de teste com arquivos fake (não no seu Downloads real!)




✅ Correção



from pathlib import Path

TIPOS = {
    "Imagens": {".jpg", ".png", ".gif", ".jpeg", ".webp"},
    "Documentos": {".pdf", ".docx", ".txt", ".md"},
    "Planilhas": {".xlsx", ".csv", ".xls"},
}


def organizar(pasta: Path) -> None:
    contagem = {}
    for arquivo in pasta.iterdir():
        if arquivo.is_dir():
            continue
        ext = arquivo.suffix.lower()
        destino_nome = "Outros"
        for categoria, extensoes in TIPOS.items():
            if ext in extensoes:
                destino_nome = categoria
                break

        destino = pasta / destino_nome
        destino.mkdir(exist_ok=True)
        arquivo.rename(destino / arquivo.name)
        contagem[destino_nome] = contagem.get(destino_nome, 0) + 1

    total = sum(contagem.values())
    detalhes = ", ".join(f"{k}: {v}" for k, v in contagem.items())
    print(f"Movidos: {total} arquivos ({detalhes})")


if __name__ == "__main__":
    from pathlib import Path
    organizar(Path("/tmp/teste_downloads"))

💡 Dica real: rode em ~/Downloads com cuidado — e faça backup antes!





HB Estudos · ← Voltar ao índice de Python