Estou tentando criar um script para listar todos os diretórios, subdiretórios e arquivos em um determinado diretório.
Eu tentei isso:
import sys,os
root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")
for r,d,f in os.walk(path):
for file in f:
print os.path.join(root,file)
Infelizmente, ele não funciona corretamente.
Eu recebo todos os arquivos, mas não os caminhos completos.
Por exemplo, se o dir struct seria:
/home/patate/directory/targetdirectory/123/456/789/file.txt
Seria impresso:
/home/patate/directory/targetdirectory/file.txt
O que eu preciso é o primeiro resultado. Qualquer ajuda seria muito apreciada! Obrigado.
Apenas no caso ... Obtendo todos os arquivos no diretório e subdiretórios correspondentes a algum padrão (* .py por exemplo):
fonte
Aqui está uma frase:
O
val for sublist in ...
loop mais externo torna a lista unidimensional. Oj
loop coleta uma lista de todos os nomes de base de arquivos e os une ao caminho atual. Finalmente, oi
loop itera sobre todos os diretórios e subdiretórios.Este exemplo usa o caminho codificado
./
naos.walk(...)
chamada, você pode complementar qualquer sequência de caminho que desejar.Nota:
os.path.expanduser
e / ouos.path.expandvars
pode ser usado para strings de caminhos como~/
Estendendo este exemplo:
É fácil adicionar testes de nome de base de arquivo e testes de nome de diretor.
Por exemplo, testando
*.jpg
arquivos:Além disso, excluindo o
.git
diretório:fonte
os.walk
sobre um loop de dirlisting manual, os geradores são ótimos, use-os.Não foi possível comentar, por isso, responda por escrito aqui. Esta é a linha mais clara que eu já vi:
fonte
Você pode dar uma olhada nesta amostra que fiz. Ele usa a função os.path.walk, que está obsoleta. Use uma lista para armazenar todos os caminhos de arquivo
fonte
Uma linha um pouco mais simples:
fonte
Como todos os exemplos aqui estão apenas usando
walk
(comjoin
), eu gostaria de mostrar um bom exemplo e comparação comlistdir
:Então, como você pode ver por si mesmo, a
listdir
versão é muito mais eficiente. (e issojoin
é lento)fonte