############################################################################## # Parte do livro Introdução à Programação com Python # Autor: Nilo Ney Coutinho Menezes # Editora Novatec (c) 2010-2020 # Primeira edição - Novembro/2010 - ISBN 978-85-7522-250-8 # Segunda edição - Junho/2014 - ISBN 978-85-7522-408-3 # Terceira Edição - Janeiro/2019 - ISBN 978-85-7522-718-3 # # Site: https://python.nilo.pro.br/ # # Arquivo: exercicios3\capitulo 09\exercicio-09-36.py ############################################################################## import sys import os import os.path import math # Esta função converte o tamanho # em unidades mais legíveis, evitando # retornar e imprimir valores muito grandes. def tamanho_para_humanos(tamanho): if tamanho == 0: return "0 byte" grandeza = math.log(tamanho, 10) if grandeza < 3: return f"{tamanho} bytes" elif grandeza < 6: return f"{tamanho / 1024.0:7.3f} KB" elif grandeza < 9: return f"{tamanho / pow(1024, 2)} MB" elif grandeza < 12: return f"{tamanho / pow(1024, 3)} GB" mascara_do_estilo = "'margin: 5px 0px 5px %dpx;'" def gera_estilo(nível): return mascara_do_estilo % (nível * 30) # Retorna uma função, onde o parâmetro nraiz é utilizado # para calcular o nível da identação def gera_nível_e_estilo(raiz): def nivel(caminho): xnivel = caminho.count(os.sep) - nraiz return gera_estilo(xnivel) nraiz = raiz.count(os.sep) return nivel # Usa a os.walk para percorrer os diretórios # E uma pilha para armazenar o tamanho de cada diretório def gera_listagem(página, diretório): diretório = os.path.abspath(diretório) # identador é uma função que calcula quantos níveis # a partir do nível de diretório um caminho deve possuir. identador = gera_nível_e_estilo(diretório) pilha = [[diretório, 0]] # Elemento de guarda, para evitar pilha vazia for raiz, diretórios, arquivos in os.walk(diretório): # Se o diretório atual: raiz # Não for um subdiretório do último percorrido # Desempilha até achar um pai comum while not raiz.startswith(pilha[-1][0]): último = pilha.pop() página.write(f"

Tamanho: (tamanho_para_humanos(último[1]))

") pilha[-1][1] += último[1] página.write(f"

{raiz}

") d_tamanho = 0 for a in arquivos: caminho_completo = os.path.join(raiz, a) d_tamanho += os.path.getsize(caminho_completo) pilha.append([raiz, d_tamanho]) # Se a pilha tem mais de um elemento # os desempilha while len(pilha) > 1: último = pilha.pop() página.write(f"

Tamanho: ({tamanho_para_humanos(último[1])})

") pilha[-1][1] += último[1] if len(sys.argv) < 2: print("Digite o nome do diretório para coletar os arquivos!") sys.exit(1) diretório = sys.argv[1] página = open("tarquivos.html", "w", encoding="utf-8") página.write(""" Arquivos """) página.write(f"Arquivos encontrados a partir do diretório: {diretório}") gera_listagem(página, diretório) página.write(""" """) página.close()