Existe uma maneira de retornar uma lista de todos os subdiretórios no diretório atual em Python?
Eu sei que você pode fazer isso com arquivos, mas preciso obter a lista de diretórios.
python
directory
subdirectory
Brad Zeis
fonte
fonte
Respostas:
Você quer dizer subdiretórios imediatos ou todos os diretórios da árvore?
De qualquer forma, você pode usar
os.walk
para fazer isso:produzirá uma tupla para cada subdiretório. A primeira entrada na 3-tupla é um nome de diretório, portanto
deve fornecer todos os subdiretórios, recursivamente.
Observe que a segunda entrada na tupla é a lista de diretórios filhos da entrada na primeira posição; portanto, você pode usá-la, mas provavelmente não economizará muito.
No entanto, você pode usá-lo apenas para fornecer os diretórios filhos imediatos:
Ou veja as outras soluções já postadas, usando
os.listdir
eos.path.isdir
, incluindo aquelas em " Como obter todos os subdiretórios imediatos no Python ".fonte
os.walk('.').next()[1]
ouos.walk('.').__next__()[1]
diretamente. Em vez disso, use a função internanext()
, disponível no Python 2 (consulte o documento) e Python 3 (consulte o documento) . Por exemplo:next(os.walk('.'))[1]
.os.walk('.').next()[1]
diretamente?iteraror.__next__()
é um método interno e oiterator.next()
uso deve ser transferido para o interno denext()
acordo com o PEP-3114. Veja PEP-3114 que foi aprovado em 2007.os.walk
e : Acabei de testar em um diretório com 10.000 subdiretórios (com milhões de arquivos na hierarquia abaixo) e as diferenças de desempenho são desprezíveis. : "10 loops, o melhor de 3: 44,6 mseg por loop" e + : "10 loops, o melhor de 3: 45,1 mseg por loop"os.listdir
os.path.isdir
os.walk
os.listdir
os.path.isdir
fonte
os.path.join
emo
obter o caminho completo, caso contrário,isdir(0)
sempre retornará falseos.path.join
duas vezes, primeiro você pode ingressar e filtrar a lista usandoos.path.isdir
:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Você poderia apenas usar
glob.glob
Não esqueça o rastro
/
após o*
.fonte
/
/
que é o separador de pastas, faça o seguinte:glob(os.path.join(path_to_directory, "*", ""))
recursive=True
Muito melhor do que o acima, porque você não precisa de vários os.path.join () e obterá o caminho completo diretamente (se desejar), você pode fazer isso no Python 3.5 e acima.
Isso fornecerá o caminho completo para o subdiretório. Se você deseja apenas o nome do subdiretório, use em
f.name
vez def.path
https://docs.python.org/3/library/os.html#os.scandir
Ligeiramente OT: Caso você precise de todas as subpastas recursivamente e / ou todos os arquivos recursivamente , observe esta função, que é mais rápida que
os.walk
&glob
e retornará uma lista de todas as subpastas, bem como de todos os arquivos dentro dessas (sub) subpastas: https://stackoverflow.com/a/59803793/2441026Caso você queira apenas todas as subpastas recursivamente :
Retorna uma lista de todas as subpastas com seus caminhos completos. Isso novamente é mais rápido que
os.walk
e muito mais rápido queglob
.Uma análise de todas as funções
tl; dr:
- Se você deseja obter todos os subdiretórios imediatos para uma pasta, use
os.scandir
.- Se você deseja obter todos os subdiretórios, mesmo os aninhados , use
os.walk
ou - um pouco mais rápido - afast_scandir
função acima.- Nunca use
os.walk
apenas subdiretórios de nível superior, pois pode ser centenas (!) De vezes mais lento queos.scandir
.os.walk
será a pasta base. Portanto, você não receberá apenas subdiretórios. Você pode usarfu.pop(0)
para removê-lo.Resultados :
Testado com W7x64, Python 3.8.1.
fonte
Se você precisar de uma solução recursiva que encontre todos os subdiretórios nos subdiretórios, use walk como proposto anteriormente.
Se você precisar apenas dos diretórios filhos do diretório atual, combine
os.listdir
comos.path.isdir
fonte
Prefiro usar o filtro ( https://docs.python.org/2/library/functions.html#filter ), mas isso é apenas uma questão de gosto.
fonte
Implementado isso usando python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
fonte
Você pode obter a lista de subdiretórios (e arquivos) no Python 2.7 usando os.listdir (caminho)
fonte
os.listdir
lista o conteúdo do diretório, incluindo arquivos.Listando apenas diretórios
Listando apenas arquivos no diretório atual
fonte
O Python 3.4 introduziu o
pathlib
módulo na biblioteca padrão, que fornece uma abordagem orientada a objetos para lidar com os caminhos do sistema de arquivos:O Pathlib também está disponível no Python 2.7 através do módulo pathlib2 no PyPi.
fonte
for f in filter(Path.is_dir, p.iterdir()):
Desde que me deparei com esse problema usando caminhos Python 3.4 e Windows UNC, aqui está uma variante para esse ambiente:
O Pathlib é novo no Python 3.4 e facilita muito o trabalho com caminhos em diferentes sistemas operacionais: https://docs.python.org/3.4/library/pathlib.html
fonte
Embora esta pergunta seja respondida há muito tempo. Quero recomendar o uso do
pathlib
módulo, pois essa é uma maneira robusta de trabalhar no Windows e no Unix OS.Portanto, para obter todos os caminhos em um diretório específico, incluindo subdiretórios:
etc.
fonte
Obrigado pelas dicas, pessoal. Corri um problema com softlinks (recursão infinita) sendo retornados como dirs. Softlinks? Não queremos links fedorentos! Assim...
Isso renderizou apenas os diretórios, não os softlinks:
fonte
[x[0] for x in inf]
chamado em python para que eu possa procurar?Copiar e colar amigável em
ipython
:Saída de
print(folders)
:fonte
x
é o item da lista criada por,os.listdir(d)
poislistdir
retornará arquivos e pastas com os quais ele está usando ofilter
comandoos.path.isdir
para filtrar todos os arquivos da lista.É assim que eu faço.
fonte
Aqui estão algumas funções simples baseadas no exemplo de @Blair Conrad -
fonte
Com base na solução de Eli Bendersky, use o seguinte exemplo:
Onde
<your_directory>
está o caminho para o diretório que você deseja percorrer.fonte
Com caminho completo e contabilidade para estar caminho
.
,..
,\\
,..\\..\\subfolder
, etc:fonte
Essa resposta parecia não existir já.
fonte
Recentemente, tive uma pergunta semelhante e descobri que a melhor resposta para o python 3.6 (conforme adicionado pelo usuário) é usar
os.scandir
. Como parece que não há solução para usá-lo, vou adicionar o meu. Primeiro, uma solução não recursiva que lista apenas os subdiretórios diretamente no diretório raiz.A versão recursiva ficaria assim:
tenha em mente que
entry.path
exerce o caminho absoluto para o subdiretório. Caso você precise apenas do nome da pasta, você pode usá-loentry.name
. Consulte os.DirEntry para obter detalhes adicionais sobre oentry
objeto.fonte
use uma função de filtro
os.path.isdir
sobreos.listdir()
algo como istofilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
fonte
Isso listará todos os subdiretórios na árvore de arquivos.
pathlib
é novo na versão 3.4fonte
Função para retornar uma Lista de todos os subdiretórios dentro de um determinado caminho do arquivo. Irá pesquisar em toda a árvore de arquivos.
fonte
podemos obter uma lista de todas as pastas usando os.walk ()
esse pathObject é um objeto e podemos obter uma matriz
Podemos obter a lista de todos os subdiretórios iterando através da arr e imprimindo a matriz intermediária
Isso imprimirá todo o subdiretório.
Para obter todos os arquivos:
fonte
Essa função, com um determinado pai,
directory
repete toda a suadirectories
recursividade eprints
tudo ofilenames
que encontra por dentro. Muito útil.fonte
Juntando várias soluções a partir daqui, foi isso que acabei usando:
fonte