Ir ao conteúdo

Posts recomendados

Postado

olá,

gostaria de saber como fazer uma barra de progresso para uma função/método, ou se tem alguma função que calcula o tempo estimado de determinada função.

ps: a função não é um laço, então usar tqdm não funciona.

 

podem me responder em qualquer linguagem que conheçam. 

  • Curtir 1
Postado

Existem várias maneiras de criar uma barra de progresso em Python. Uma forma é usando o módulo tqdm, que fornece uma barra de progresso simples que pode ser usada em um loop. Aqui está um exemplo de como usá-lo:

from tqdm import tqdm

# Sua função ou método
def long_function():
    # Faça algo aqui
    pass

# Execute a função com a barra de progresso
for i in tqdm(range(1000)):
    long_function()

sso mostrará uma barra de progresso que irá atualizar a cada iteração do loop. Você também pode usar a opção desc para fornecer uma descrição da tarefa sendo realizada.

Se você quiser calcular o tempo estimado de execução de uma função, pode usar o módulo timeit para medir o tempo de execução da função. Aqui está um exemplo de como fazer isso:

import timeit

# Sua função ou método
def long_function():
    # Faça algo aqui
    pass

# Calcule o tempo de execução da função
elapsed_time = timeit.timeit(long_function, number=1)

# Imprima o tempo de execução
print(f'Tempo de execução: {elapsed_time:.2f} segundos')

 

  • Curtir 1
Postado
3 horas atrás, Swalls disse:

@herbertbahia como faço isso para a zipagem de arquivos com o zipfile?

você pode usar a função zipfile.ZipFile.write() e monitorar o progresso da compressão.

import zipfile

def zip_files(input_files, output_filename):
  # Abrir o arquivo zip em modo de gravação
  with zipfile.ZipFile(output_filename, 'w') as zip_object:
    # Percorrer a lista de arquivos de entrada
    for i, file in enumerate(input_files):
      # Obter o nome do arquivo e o tamanho em bytes
      file_name = file.name
      file_size = file.stat().st_size
      
      # Adicionar o arquivo ao arquivo zip
      zip_object.write(file_name)
      
      # Atualizar a barra de progresso
      print(f'{i+1}/{len(input_files)} - {file_name} ({file_size} bytes)')

# Testar a função zip_files
zip_files(['file1.txt', 'file2.txt'], 'output.zip')

O código acima lê a lista de arquivos de entrada, abre um novo arquivo zip em modo de gravação e adiciona cada arquivo ao arquivo zip usando a função zipfile.ZipFile.write(). Em seguida, atualiza a barra de progresso exibindo o número de arquivos processados e o nome do arquivo atual.

Você também pode usar a biblioteca tqdm para criar uma barra de progresso mais visualmente atraente. Aqui está um exemplo de como fazer isso:

from tqdm import tqdm

def zip_files(input_files, output_filename):
  # Abrir o arquivo zip em modo de gravação
  with zipfile.ZipFile(output_filename, 'w') as zip_object:
    # Criar um objeto tqdm para exibir a barra de progresso
    with tqdm(total=len(input_files)) as pbar:
      # Percorrer a lista de arquivos de entrada
      for file in input_files:
        # Obter o nome do arquivo
        file_name = file.name
        
        # Adicionar o arquivo ao arquivo zip
        zip_object.write(file_name)
        
        # Atualizar a barra de progresso
        pbar.update(1)

# Testar a função zip_files
zip_files(['file1.txt', 'file2.txt'], 'output.zip')

tqdmé usado para exibir a barra de progresso. A barra de progresso é inicializada com o número total de arquivos e, em seguida, é atualizada a cada iteração do loop usando o métodotqdm.update()`.

Você também pode usar a biblioteca click para adicionar opções de linha de comando à sua função, como um modo silencioso para desativar a exibição da barra de progresso. Aqui está um exemplo de como fazer isso:

import click

@click.command()
@click.option('--silent', is_flag=True, help='Desativar a exibição da barra de progresso')
def zip_files(input_files, output_filename, silent):
  # Abrir o arquivo zip em modo de gravação
  with zipfile.ZipFile(output_filename, 'w') as zip_object:
    # Verificar se o modo silencioso está ativo
    if not silent:
      # Criar um objeto tqdm para exibir a barra de progresso
      with tqdm(total=len(input_files)) as pbar:
        # Percorrer a lista de arquivos de entrada
        for file in input_files:
          # Obter o nome do arquivo
          file_name = file.name
          
          # Adicionar o arquivo ao arquivo zip
          zip_object.write(file_name)
          
          # Atualizar a barra de progresso
          pbar.update(1)
    else:
      # Percorrer a lista de arquivos de entrada sem exibir a barra de progresso
      for file in input_files:
        # Obter o nome do arquivo
        file_name = file.name
        
        # Adicionar o arquivo ao arquivo zip
        zip_object.write(file_name)

# Testar a função zip_files com a opção --silent
zip_files(['file1.txt', 'file2.txt'], 'output.zip', silent=True)

Neste exemplo, a função zip_files() é decorada com o decorador click.command() para transformá-la em um comando de linha de comando. A opção --silent é adicionada usando o decorador click.option(), que permite desativar a exibição da barra de progresso.

  • Curtir 1
Postado

@herbertbahia muito obrigado pela resposta, mas ainda não se aplica, no meu software os arquivos .bak tem entre 0,3 a 25 giga, e eu preciso de uma porcentagem de conclusão de cada arquivo, não de um "for" rodando um a um. O software já está feito, no back há 2 métodos:

zipar_lzma(): para caso não haja rar instalado ou o arquivo seja superior a 0,5 giga.

zipar_rar(): para caso haja rar instalado e seja superior a 0,5 giga.

o problema no caso, é que não quero a porcentagem de conclusão de tudo e sim de um arquivo.

 

  • Curtir 1
Postado

@herbertbahiaarea de código que zipa

        lzma,rar = self.para_zipar_hoje()
        self.__threadlist.clear()
        if com_lzma:
            for nome in lzma:
                t = threading.Thread(target=self.zipar_lzma,args=(nome,))
                t.start()
                self.__threadlist.append(t)
            for nome in rar:
                t = threading.Thread(target=self.winrar_rar,args=(nome,))
                t.start()
                self.__threadlist.append(t)
        else:   
            for nome in rar.extend(lzma):
                t = threading.Thread(target=self.winrar_rar,args=(nome,))
                t.start()
                self.__threadlist.append(t)

 

 

a barra de progresso queria que aparecesse no centro das linhas de uma tabela.

a tabela tem as linhas com listas [nome,estado,resultado], queria gerar um update contínuo com a barra de progresso ou porcentagem em "estado" até que no final fique "comprimido com sucesso".

 

  • Curtir 1
Postado

Para exibir uma barra de progresso para uma função que não é um laço, voce pode adicionar uma variavel para armazenar o progresso atual da função e atualizar essa variavel enquanto a função estiver sendo executada. Depois, voce pode usar essa variavel para exibir a barra de progresso na tabela.

voce pode adicionar um argumento na sua função zipar_lzma e zipar_rar para armazenar o progresso atual da compactação do arquivo. Por exemplo:

def zipar_lzma(nome, progresso):
    # codigo para compactar o arquivo
    # atualiza o progresso
    progresso[nome] = 50 # exemplo, o progresso é 50%

def zipar_rar(nome, progresso):
    # codigo para compactar o arquivo
    # atualiza o progresso
    progresso[nome] = 75 # exemplo, o progresso é 75%

voce pode criar uma variavel compartilhada (como um dicionario) para armazenar o progresso atual de cada arquivo e passar essa variavel como argumento para as threads.

Exemplo:

import threading

progresso = {} # dicionario para armazenar o progresso de cada arquivo

# cria as threads
threads = []
for nome in nomes_dos_arquivos:
    t = threading.Thread(target=zipar_lzma if usar_lzma else zipar_rar, args=(nome, progresso))
    t.start()
    threads.append(t)

# espera até que todas as threads terminem
for t in threads:
    t.join()

# todos os arquivos foram compactados
# atualiza o resultado final da compactação na tabela

voce pode usar o dicionario progresso para atualizar a barra de progresso na tabela enquanto as threads estão sendo executadas. Quando todas as threads terminarem, voce pode atualizar o resultado final da compactação na tabela.

voce pode usar a biblioteca time para calcular o tempo estimado para a conclusão da função. voce pode medir o tempo que a função leva para executar e usar essa informação para estimar o tempo restante para a conclusão da função.

  • Curtir 1
Postado

@herbertbahia onde fica esse progresso atual? não fui eu que fiz o calculo de compactação, se fosse provavelmente estaria rico agora, mas eu olhei ambos os modulos zipfile e o modulo lzma e nenhum deles aparenta(talvez eu não tenha achado) algum parâmetro/propriedade que indique o decorrer de um processo.

também tentei usar o modulo os para fazer chamadas para o winrar via cmd mas não achei nenhum parâmetro que indique o percentual como saída.

  • Curtir 1
Postado

Para verificar o progresso da descompactação de um arquivo zip usando o módulo zipfile do Python, você pode usar o método extractall() e passar um objeto de retorno de chamada (callback) como um argumento. Esse objeto de retorno de chamada deve ser uma função que será chamada a cada vez que um arquivo é extraído do arquivo zip. Você pode usar essa função para exibir o progresso da descompactação para o usuário.

Aqui está um exemplo de como fazer isso:

import zipfile

def unzip_progress(zip_obj):
    print("Descompactando arquivo %s" % zip_obj.filename)

zip_file = zipfile.ZipFile("arquivo.zip", "r")
zip_file.extractall(callback=unzip_progress)
zip_file.close()

Para verificar o progresso da descompactação de um arquivo lzma usando o módulo lzma do Python, você pode usar o método open() para abrir o arquivo lzma e então usar o método read() para ler os dados. A cada vez que você chama o método read(), você pode atualizar uma barra de progresso ou exibir uma mensagem de progresso para o usuário.

Aqui está um exemplo de como fazer isso:

import lzma

CHUNK_SIZE = 1024  # Tamanho do pedaço de dados a ser lido por iteração

with lzma.open("arquivo.lzma", "rb") as lzma_file:
    # Obtenha o tamanho total do arquivo
    total_size = lzma_file.getbuffer().size()

    # Inicialize a variável de progresso
    progress = 0

    while True:
        data = lzma_file.read(CHUNK_SIZE)
        if not data:
            # O arquivo foi lido completamente
            break

        # Atualize o progresso
        progress += len(data)
        percentage = int(progress / total_size * 100)
        print("Progresso da descompactação: %d%%" % percentage)

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...