Eu sei que podemos usar os.walk()
para listar todos os subdiretórios ou todos os arquivos em um diretório. No entanto, gostaria de listar o conteúdo completo da árvore do diretório:
- Subdirectory 1:
- file11
- file12
- Sub-sub-directory 11:
- file111
- file112
- Subdirectory 2:
- file21
- sub-sub-directory 21
- sub-sub-directory 22
- sub-sub-sub-directory 221
- file 2211
Qual a melhor forma de conseguir isso em Python?
ValueError: zero length field name in format
é lançado.root.replace(startpath, '', 1)
deve corrigir issoSemelhante às respostas acima, mas para python3, indiscutivelmente legível e indiscutivelmente extensível:
Exemplo de uso:
Exemplo de saída:
Notas
Editar:
fonte
Uma solução sem seu recuo:
os.walk já faz a caminhada de cima para baixo que você está procurando.
Ignorar a lista dirs evita a sobreposição que você mencionou.
fonte
NameError: name 'path' is not defined
Normalmente preferimos usar apenas a árvore GNU, mas nem sempre temos
tree
em todos os sistemas e, às vezes, o Python 3 está disponível. Uma boa resposta aqui poderia ser facilmente copiada e colada e não tornar o GNUtree
um requisito.tree
A saída de é parecida com esta:Criei a estrutura de diretório acima em meu diretório inicial em um diretório que chamo
pyscratch
.Também vejo outras respostas aqui que abordam esse tipo de saída, mas acho que podemos fazer melhor, com um código mais simples e moderno e abordagens de avaliação preguiçosas.
Árvore em Python
Para começar, vamos usar um exemplo que
Path
objeto Python 3yield
eyield from
(que criam uma função geradora)e agora:
estampas:
Precisamos materializar cada diretório em uma lista porque precisamos saber quanto tempo ele é, mas depois jogamos a lista fora. Para uma recursão ampla e profunda, isso deve ser lento o suficiente.
O código acima, com os comentários, deve ser suficiente para entender completamente o que estamos fazendo aqui, mas sinta-se à vontade para percorrê-lo com um depurador para melhor controlá-lo se precisar.
Mais recursos
Agora, o GNU
tree
nos oferece alguns recursos úteis que eu gostaria de ter com esta função:n directories, m files
-L level
-d
Além disso, quando há uma árvore enorme, é útil limitar a iteração (por exemplo, com
islice
) para evitar travar seu interpretador com texto, pois em algum ponto a saída se torna muito prolixa para ser útil. Podemos tornar isso arbitrariamente alto por padrão - digamos1000
.Portanto, vamos remover os comentários anteriores e preencher esta funcionalidade:
E agora podemos obter o mesmo tipo de saída que
tree
:estampas:
E podemos restringir a níveis:
estampas:
E podemos limitar a saída aos diretórios:
estampas:
Retrospectivo
Em retrospecto, poderíamos ter usado
path.glob
para correspondência. Também poderíamos usarpath.rglob
para globbing recursivo, mas isso exigiria uma reescrita. Também poderíamos usar emitertools.tee
vez de materializar uma lista de conteúdo de diretório, mas isso poderia ter compensações negativas e provavelmente tornaria o código ainda mais complexo.Comentários são bem vindos!
fonte
elif not limit_to_directories:
adicione o seguinte:info = prefix + pointer + path.name; try: with path.open('r') as f: n_lines = len(f.readlines()); loc = f' LOC: {n_lines}'; info += loc; except UnicodeDecodeError: pass; yield info
Consulte este link para obter os espaços em branco adequados.contents
precisa ser filtrado selimit_to_directories
for True. Caso contrário, se uma pasta não tiver um diretório para o último arquivo, a árvore não será desenhada corretamente.if limit_to_directories: contents = [path for path in contents if path.is_dir()]
list(dir_path.iterdir())
retornar uma árvore de cima para baixo devidamente ordenada da estrutura de diretórios. Não vejo essa garantia na API para iterdir () . Forneça uma referência sobre como ositerdir()
pedidos ou são garantidos para fornecer o pedido desejado.os.listdir()
por padrão - o que não garante a ordem : "A lista está em ordem arbitrária e não inclui as entradas especiais '.' e '..' mesmo se estiverem presentes no diretório. "Vim aqui procurando a mesma coisa e usei a resposta dhobbs para mim. Como forma de agradecer à comunidade, adicionei alguns argumentos para escrever em um arquivo, como akshay pediu, e tornei a exibição de arquivos opcional, para que não seja tão pouco uma saída. Também tornou o recuo um argumento opcional para que você possa alterá-lo, pois alguns gostam que seja 2 e outros preferem 4.
Usou loops diferentes para que aquele que não mostra os arquivos não verifique se precisa em cada iteração.
Espero que ajude alguém, já que dhobbs answer me ajudou. Muito obrigado.
fonte
Com base nesta postagem fantástica
http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/
Aqui está um refinamento para se comportar exatamente como
http://linux.die.net/man/1/tree
fonte
Se alguém estiver interessado - essa função recursiva retorna uma estrutura aninhada de dicionários. As chaves são
file system
nomes (de diretórios e arquivos), os valores são:file_token
)As strings que designam os arquivos estão vazias neste exemplo. Eles também podem receber, por exemplo, o conteúdo do arquivo ou as informações ou privilégios do proprietário ou qualquer objeto diferente de um dict. A menos que seja um dicionário, ele pode ser facilmente distinguido de um "tipo de diretório" em outras operações.
Ter essa árvore em um sistema de arquivos:
O resultado será:
Se você gosta disso, já criei um pacote (python 2 e 3) com isso (e um bom
pyfakefs
ajudante): https://pypi.org/project/fsforge/fonte
Além da resposta dhobbs acima ( https://stackoverflow.com/a/9728478/624597 ), aqui está uma funcionalidade extra de armazenamento de resultados em um arquivo (eu pessoalmente uso para copiar e colar no FreeMind para ter uma boa visão geral de a estrutura, portanto usei tabulações em vez de espaços para indentação):
fonte
Você pode executar o comando 'tree' do shell do Linux.
Instalação:
Usando em python
Exemplo:
Isso proporciona uma estrutura mais limpa e é visualmente mais abrangente e fácil de digitar.
fonte
Esta solução só funcionará se você tiver
tree
instalado em seu sistema. No entanto, estou deixando esta solução aqui apenas no caso de ajudar outra pessoa.Você pode dizer à árvore para gerar a estrutura da árvore como XML (
tree -X
) ou JSON (tree -J
). JSON, é claro, pode ser analisado diretamente com Python e XML pode ser facilmente lido comlxml
.Com a seguinte estrutura de diretório como exemplo:
XML
JSON
fonte
Talvez mais rápido do que @ellockie (talvez)
Resultados do teste na captura de tela abaixo:
fonte
Aqui você pode encontrar código com saída como esta: https://stackoverflow.com/a/56622847/6671330
fonte
Para quem ainda está procurando uma resposta. Aqui está uma abordagem recursiva para obter os caminhos em um dicionário.
fonte
A resposta de @dhobbs é ótima!
mas simplesmente mude para fácil obter as informações do nível
e a saída como
você pode obter o nível por
|
contagem!fonte