############################################################################## # Parte do livro Introdução à Programação com Python # Autor: Nilo Ney Coutinho Menezes # Editora Novatec (c) 2010-2017 # Primeira edição - Novembro/2010 - ISBN 978-85-7522-250-8 # Primeira reimpressão - Outubro/2011 # Segunda reimpressão - Novembro/2012 # Terceira reimpressão - Agosto/2013 # Segunda edição - Junho/2014 - ISBN 978-85-7522-408-3 # Primeira reimpressão - Segunda edição - Maio/2015 # Segunda reimpressão - Segunda edição - Janeiro/2016 # Terceira reimpressão - Segunda edição - Junho/2016 # Quarta reimpressão - Segunda edição - Março/2017 # Terceira Edição - Janeiro/2019 # # Site: http://python.nilo.pro.br/ # # Arquivo: exercicios\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 "%d bytes" % tamanho elif grandeza < 6: return "%7.3f KB" % (tamanho / 1024.0) elif grandeza < 9: return "%f MB" % (tamanho / pow(1024,2)) elif grandeza < 12: return "%f GB" % (tamanho / pow(1024,3)) 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("

Tamanho: (%s)

" % (identador(último[0]), tamanho_para_humanos(último[1]))) pilha[-1][1]+=último[1] página.write("

%s

" % (identador(raiz), 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("

Tamanho: (%s)

" % (identador(último[0]), 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("Arquivos encontrados a partir do diretório: %s" % diretório) gera_listagem(página, diretório) página.write(""" """) página.close()