Python: Criando Barra de Progresso com urllib

Se você está trabalhando com downloads de arquivos em Python usando a biblioteca urllib, é comum precisar mostrar o progresso do download de forma clara e intuitiva para o usuário. Embora a função urllib.request.urlretrieve ofereça um mecanismo de progresso básico, é possível melhorar a experiência ao exibir uma barra de progresso visual (como: ) diretamente na linha de comando. Vamos explorar como implementar isso de forma simples e eficaz.

📌 1. Mostrar Progresso de Forma Visual

Ao utilizar urllib.request.urlretrieve, você pode usar o parâmetro reporthook para monitorar o progresso do download. No entanto, o progresso é mostrado em formato de porcentagem, o que pode não ser tão intuitivo para o usuário. Para tornar isso mais visual, podemos criar uma barra de progresso que se atualize em tempo real.

📌 2. Usar \r para Manter o Progresso na Mesma Linha

O caractere especial \r (carriage return) permite que o cursor retorne ao início da linha, permitindo que o progresso seja atualizado dinamicamente sem quebrar a linha. Combinando isso com um loop de progresso, podemos exibir uma barra de progresso visual.

✅ Código com Barra de Progresso Visual

import urllib.request
import os

def barra_de_progresso(count, block_size, total_size):
    """
    Função de callback para exibir uma barra de progresso visual.
    """
    if total_size > 0:
        percent = (count * block_size) / total_size * 100
        filled = int(percent // 10)  # Calcula a porcentagem em blocos de 10%
        bar = "█" * filled + " " * (10 - filled)  # Cria a barra de progresso
        print(f"\rProgresso: [{bar}] {percent:.2f}% ", end="")  # Mantém a linha atualizada
    else:
        print(f"\rProgresso: {count * block_size} bytes transferidos", end="")

# Exemplo de uso
URL_ARQUIVO = "https://example.com/video.mp4"
NOME_SALVAR = "video.mp4"
PATH = os.path.join("/tmp", NOME_SALVAR)

urllib.request.urlretrieve(URL_ARQUIVO, PATH, reporthook=barra_de_progresso)

📌 3. Como Funciona a Barra de Progresso

  • filled: Calcula a porcentagem do progresso em blocos de 10% (ex: 30% → 3 blocos de ).
  • bar: Concatena blocos de (preenchidos) e (espaços vazios) para formar a barra.
  • \r + end="": Mantém o progresso na mesma linha, atualizando-o a cada bloco transferido.

📌 4. Resultado Esperado

Ao executar o código acima, você verá algo como:

Progresso: [███████████ ] 75.00% 
Progresso: [████████████████] 100.00% 

📌 5. Conclusão

Criar uma barra de progresso visual em Python com urllib é simples e eficaz. A combinação de \r e um loop de progresso permite que você exiba o status do download de forma clara e interativa. Se quiser, posso te ajudar a adaptar esse conceito para outros tipos de downloads ou até mesmo criar uma interface gráfica (como com tkinter ou pygame) para tornar a experiência ainda mais envolvente! 😊