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! 😊
