top of page
Search
wendytrethewey266r

Download with Progress Bar Python: como fazer um download com uma barra de progresso usando a lingua



Baixe com barra de progresso em Python




Neste artigo, você aprenderá como baixar arquivos da web em Python usando a biblioteca request e como adicionar uma barra de progresso aos seus downloads usando a biblioteca tqdm. Você também aprenderá como copiar arquivos e diretórios em Python usando a biblioteca shutil e como preservar metadados e permissões de arquivo.


Introdução




O que é uma barra de progresso?




Uma barra de progresso é um indicador gráfico que mostra o status de conclusão de uma tarefa, como um download de arquivo, uma transferência de dados ou um treinamento de modelo de aprendizado de máquina. Uma barra de progresso geralmente consiste em uma barra retangular que é preenchida à medida que a tarefa avança e uma porcentagem ou uma estimativa de tempo que indica quanto da tarefa foi concluída ou quanto tempo resta.




download with progress bar python



Por que usar uma barra de progresso?




Uma barra de progresso pode fornecer vários benefícios para usuários e desenvolvedores de programas Python que envolvem download ou cópia de arquivos:


  • Ele pode melhorar a experiência do usuário, fornecendo feedback sobre o andamento e a duração da tarefa e reduzindo a incerteza e a frustração.



  • Ele pode ajudar a depurar e otimizar o programa, mostrando a velocidade e a eficiência da transferência de arquivos e revelando quaisquer erros ou gargalos.



  • Ele pode tornar o programa mais interativo e envolvente, adicionando algum apelo visual e animação à saída do console.



Como baixar arquivos em Python




Usando a biblioteca de solicitações




A biblioteca request é uma das bibliotecas mais populares e poderosas para fazer requisições HTTP em Python. Ele permite que você envie e receba facilmente dados de servidores da Web e manipule diferentes tipos de métodos HTTP, cabeçalhos, parâmetros, cookies, autenticação, proxies, redirecionamentos, erros e muito mais.


O método GET




Um dos métodos HTTP mais comuns é GET, que indica que você deseja obter ou recuperar dados de um recurso especificado, como uma página da Web ou um arquivo. Para fazer uma solicitação GET usando solicitações, você pode usar o pedidos.get() função, que recebe uma URL como argumento e retorna um objeto Response.


Por exemplo, suponha que você queira baixar um arquivo de texto de . Você pode usar o seguinte código:



resposta de solicitações de importação = requests.get("


O objeto de resposta




O objeto Response contém várias informações sobre a resposta do servidor, como o código de status, os cabeçalhos, o conteúdo e muito mais. Você pode acessar esses atributos e métodos usando a notação de ponto. Por exemplo:



response.status_code # retorna 200 se for bem-sucedido response.headers # retorna um dicionário de cabeçalhos de resposta response.content # retorna o conteúdo binário da resposta response.text # retorna o conteúdo de texto decodificado da resposta response.json() # retorna o conteúdo JSON analisado da resposta


resposta.conteúdo para o objeto de arquivo usando o escrever() método. Por exemplo:



com open("file.txt", "wb") como f: f.write(response.content)


Isso criará um arquivo chamado arquivo.txt no diretório de trabalho atual e escreva o conteúdo da resposta nele. Você também pode especificar um caminho ou nome de arquivo diferente para o arquivo.


Como adicionar uma barra de progresso aos downloads em Python




Usando a biblioteca tqdm




A biblioteca tqdm é uma biblioteca simples e rápida para criar barras de progresso em Python. Ele oferece suporte a vários tipos de iteradores, como listas, dicionários, arquivos e geradores, e pode estimar automaticamente o tempo restante e a velocidade da iteração. Ele também tem baixo overhead e pode ser facilmente customizado e integrado com outras bibliotecas.


Instalando tqdm




Para instalar o tqdm, você pode usar o pip comando no seu terminal:



pip instalar tqdm


Alternativamente, você pode usar o conda comando se você estiver usando o Anaconda:



conda install tqdm


Usando tqdm com solicitações




Para usar tqdm com solicitações, você pode agrupar o response.iter_content() método com o tqdm() função. O response.iter_content() O método retorna um iterador que produz blocos do conteúdo da resposta como bytes. O tqdm() A função usa um iterador como argumento e retorna um objeto de barra de progresso que é atualizado conforme o iterador é consumido.


Você também pode passar alguns argumentos opcionais para o tqdm() função, como total, que especifica o número total de iterações ou bytes esperados; unidade, que especifica a unidade de medida da barra de progresso; e descrição, que especifica um prefixo para a barra de progresso. Por exemplo:



importar solicitações de tqdm importar tqdm response = requests.get(" stream=True) total_size = int(response.headers.get("content-length", 0)) progress_bar = tqdm(response.iter_content(1024), total=total_size, unit="B", unit_scale=True, desc="Baixando arquivo.txt") com open( "file.txt", "wb") as f: para chunk em progress_bar: se chunk: f.write(chunk) progress_bar.update(len(chunk)) progress_bar.close()


Isso fará o download do arquivo e exibirá uma barra de progresso como esta:



Baixando arquivo.txt: 100% 10,0M/10,0M [00:05


Personalizando o tqdm




A biblioteca tqdm oferece muitas opções para personalizar a aparência e o comportamento da barra de progresso. Você pode verificar a documentação para obter mais detalhes, mas aqui estão alguns exemplos do que você pode fazer:


progress_bar = tqdm(response.iter_content(1024), total=total_size, unit="B", unit_scale=True, desc="Downloading file.txt", bar_format="desc: percentage:3.0f%bar n_fmt/total_fmt [elapsed


Isso exibirá uma barra de progresso como esta:



Baixando arquivo.txt: 100% 10,0 M/10,0 M [00:05


  • Você pode adicionar sufixos dinâmicos à barra de progresso usando o set_postfix() método, que usa um dicionário de pares chave-valor para exibir após a velocidade. Por exemplo:




progress_bar = tqdm(response.iter_content(1024), total=total_size, unit="B", unit_scale=True, desc="Downloading file.txt") with open("file.txt", "wb") as f: for chunk in progress_bar: if chunk: f.write(chunk) progress_bar.update(len(chunk)) progress_bar.set_postfix(file="file.txt", size=f"len(ch unk)/1024:.2f KB") progress_bar.close()


Isso exibirá uma barra de progresso como esta:



Baixando arquivo.txt: 100% 10,0M/10,0M [00:05


  • Você pode usar diferentes estilos de barras de progresso usando o gui, caderno, ou auto módulos do tqdm, que podem detectar o ambiente e usar o back-end apropriado. Por exemplo:




from tqdm.auto import tqdm progress_bar = tqdm(response.iter_content(1024), total=total_size, unit="B", unit_scale=True, desc="Baixando arquivo.txt")


Isso exibirá uma barra de progresso que se adapta ao terminal, ao notebook Jupyter ou à interface gráfica do usuário.


Como copiar arquivos e diretórios em Python




Usando a biblioteca shutil




A biblioteca shutil é uma biblioteca padrão que fornece operações de alto nível para copiar e mover arquivos e diretórios em Python. Ele pode lidar com diferentes tipos de arquivos, como arquivos normais, links simbólicos e arquivos especiais, e pode preservar os metadados e as permissões do arquivo.


Instalando Shutil




A biblioteca shutil está incluída na biblioteca padrão do Python, então você não precisa instalá-la separadamente. Você pode simplesmente importá-lo usando o importar declaração:



import shutil


Usando shutil com pedidos e tqdm




Para usar shutil com solicitações e tqdm, você pode usar o shutil.copyfileobj() função, que recebe dois objetos semelhantes a arquivos como argumentos e copia os dados de um para outro. você pode passar o resposta.raw objeto como o objeto de arquivo de origem e um objeto de arquivo aberto como o objeto de arquivo de destino. Você também pode passar um terceiro argumento para especificar o tamanho do buffer para cópia.


Para adicionar uma barra de progresso ao processo de cópia, você pode agrupar o resposta.raw objeto com o tqdm() e passe os mesmos argumentos de antes. Por exemplo:



importar solicitações importar shutil de tqdm importar tqdm response = requests.get(" stream=True) total_size = int(response.headers.get("content-length", 0)) progress_bar = tqdm(response.raw, total=total_size, unit="B", unit_scale=True, desc="Copiando arquivo.txt") com open("file.txt", "wb") como f: shutil.copyfileobj(progress_bar, f) progress_bar.close()


Isso copiará o arquivo e exibirá uma barra de progresso como esta:



Copiando arquivo.txt: 100% 10,0M/10,0M [00:05


Copiando metadados e permissões de arquivo




como seu nome, tamanho, hora de modificação, proprietário, permissões, etc. Para copiar os metadados e permissões do arquivo, você pode usar o shutil.copyfile() função, que recebe dois nomes de arquivo como argumentos e copia o conteúdo e os metadados do arquivo de origem para o arquivo de destino. Por exemplo:



import shutil shutil.copyfile("source.txt", "destination.txt")


Isso irá copiar o arquivo source.txt para destino.txt, junto com seus metadados e permissões. No entanto, esta função não suporta barras de progresso ou argumentos de tamanho de buffer.


Para copiar o conteúdo e os metadados do arquivo e também usar uma barra de progresso e um tamanho de buffer, você pode combinar o shutil.copyfileobj() e a shutil.copystat() funções. O shutil.copystat() A função usa dois nomes de arquivo como argumentos e copia os metadados e as permissões do arquivo de origem para o arquivo de destino. Por exemplo:



import request import shutil from tqdm import tqdm response = requests.get(" stream=True) total_size = int(response.headers.get("content-length", 0)) progress_bar = tqdm(response.raw, total=total_size, unit="B", unit_scale=True, desc="Copiando arquivo.txt") com open("file.txt", "wb") as f: shutil.copyfileobj(progress_bar, f, 1024) progress_bar.close() shutil.copystat(" "file.txt")


Isso copiará o arquivo e seus metadados e permissões e exibirá uma barra de progresso como esta:



Copiando arquivo.txt: 100% 10,0M/10,0M [00:05


Conclusão




Resumo dos principais pontos




Neste artigo, você aprendeu como baixar arquivos da web em Python usando a biblioteca request e como adicionar uma barra de progresso aos seus downloads usando a biblioteca tqdm. Você também aprendeu como copiar arquivos e diretórios em Python usando a biblioteca shutil e como preservar metadados e permissões de arquivos.


Outros recursos e links




Se quiser saber mais sobre esses tópicos, confira os seguintes recursos e links:


  • A documentação oficial da biblioteca de pedidos:



  • A documentação oficial da biblioteca tqdm:



  • A documentação oficial da biblioteca shutil:



  • Um tutorial sobre como baixar arquivos em Python:



  • Um tutorial sobre como usar barras de progresso em Python:



  • Um tutorial sobre como copiar arquivos e diretórios em Python:



perguntas frequentes




Como faço para baixar vários arquivos em Python?




Para baixar vários arquivos em Python, você pode usar um loop ou uma compreensão de lista para iterar em uma lista de URLs e chamar o pedidos.get() função para cada URL.Você também pode usar um pool de threads ou um pool de processos para paralelizar os downloads e acelerar o processo. Por exemplo:



solicitações de importação de concurrent.futures import ThreadPoolExecutor urls = [" " " filenames = ["file1.txt", "file2.txt", "file3.txt"] def download_file(url, filename): response = requests.get(url) with open( filename, "wb") como f: f.write(response.content) com ThreadPoolExecutor(max_workers=3) como executor: executor.map(download_file, urls, filenames)


Isso fará o download de três arquivos em paralelo usando três threads.


Como faço para baixar arquivos grandes em Python?




Para baixar arquivos grandes em Python, você pode usar o fluxo argumento do pedidos.get() função, que permite transmitir o conteúdo da resposta em vez de carregá-lo na memória. Isso pode economizar memória e melhorar o desempenho ao lidar com arquivos grandes. Você também pode usar o iter_content() ou iter_lines() métodos do objeto Response para iterar sobre o conteúdo transmitido em blocos ou linhas. Por exemplo:



import request response = requests.get(" stream=True) with open("large_file.zip", "wb") as f: for chunk in response.iter_content(1024): if chunk: f.write(chunk)


Isso fará o download de um arquivo zip grande em blocos de 1 KB e os gravará em um arquivo local.


Como faço para baixar arquivos com autenticação em Python?




Para baixar arquivos com autenticação em Python, você pode usar o autenticação argumento do pedidos.get() função, que permite passar uma tupla de nome de usuário e senha, ou um objeto que implementa o __chamar__() método para autenticação personalizada. Você também pode usar o request.auth módulo para fornecer diferentes tipos de autenticação, como Basic, Digest, OAuth, etc. Por exemplo:



importar solicitações de request.auth import HTTPBasicAuth response = requests.get(" auth=HTTPBasicAuth("user", "pass")) with open("secret_file.txt", "wb") as f: f.write(response.content)


Isso fará o download de um arquivo que requer autenticação básica usando um nome de usuário e senha.


Como faço para baixar arquivos com cabeçalhos ou parâmetros em Python?




Para baixar arquivos com cabeçalhos ou parâmetros em Python, você pode usar o cabeçalhos ou parâmetros argumentos do pedidos.get() função, que permite passar um dicionário de pares chave-valor para personalizar os cabeçalhos de solicitação ou parâmetros de consulta. Por exemplo:



import request headers = "User-Agent": "Mozilla/5.0" params = "q": "python", "lang": "en" response = requests.get(" headers=headers, params=params) with open("search_results.html", "wb") as f: f.write(response.content)


Isso fará o download de uma página da Web que mostra os resultados da pesquisa por "python" em inglês, usando um cabeçalho de agente de usuário personalizado.


Como lidar com erros ou exceções ao baixar arquivos em Python?




Para lidar com erros ou exceções ao baixar arquivos em Python, você pode usar o aumentar_para_status() método do objeto Response, que gerará uma exceção HTTPError se o código de status da resposta não for 200 (OK). Você também pode usar um bloco try-except para detectar e manipular quaisquer outras exceções que possam ocorrer durante o processo de download, como ConnectionError, TimeoutError, IOError, etc. Por exemplo:



solicitações de importação try: response = requests.get(" response.raise_for_status() with open("file.txt", "wb") as f: f.write(response.content) exceto requests.exceptions.HTTPError as e: print(f"HTTP Error: e") except requests.exceptions.ConnectionError as e: print(f"Connection Error: e") except requests.exceptions.TimeoutE rror as e: print(f"Timeout Error: e") except IOError as e: print(f"IO Error: e")


Isso fará o download de um arquivo e lidará com quaisquer erros ou exceções que possam ocorrer.



0517a86e26


1 view0 comments

Recent Posts

See All

Comentários


bottom of page