Quero poder listar apenas os diretórios dentro de alguma pasta. Isso significa que eu não quero nomes de arquivos listados, nem subpastas adicionais.
Vamos ver se um exemplo ajuda. No diretório atual, temos:
>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
'Tools', 'w9xpopen.exe']
No entanto, não quero nomes de arquivos listados. Também não quero subpastas como \ Lib \ curses. Essencialmente, o que eu quero funciona com o seguinte:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
No entanto, estou me perguntando se existe uma maneira mais simples de obter os mesmos resultados. Tenho a impressão de que usar o os.walk apenas para retornar o nível superior é ineficiente / demais.
python
filesystems
fuentesjr
fonte
fonte
os.walk
Use
os.walk
com anext
função item:Para Python <= 2.5, use:
Como isso funciona
os.walk
é um gerador e a chamadanext
obterá o primeiro resultado na forma de três tuplas (caminho de rota, nome de diretório, nome de arquivo). Assim, o[1]
índice retorna apenas odirnames
dessa tupla.fonte
DIRNAMES=1
e, em seguida,next()[DIRNAMES]
para facilitar o entendimento para futuros mantenedores de código.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Filtre a lista usando os.path.isdir para detectar diretórios.
fonte
os.listdir
retorna um nome de arquivo / pasta, passado paraos.path.isdir
, mas o último precisa de um caminho completo.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
fonte
Observe que, em vez de fazer
os.listdir(os.getcwd())
, é preferível fazeros.listdir(os.path.curdir)
. Menos uma chamada de função e é tão portátil.Portanto, para concluir a resposta, obtenha uma lista de diretórios em uma pasta:
Se você preferir nomes de caminho completos, use esta função:
fonte
Isso parece funcionar também (pelo menos no linux):
fonte
glob
. Ele pode te salvar um monte de código, especialmente iterações, e é muito semelhante ao uso UNIX terminal (ls
)Apenas para acrescentar que o uso de os.listdir () não "exige muito processamento versus muito simples os.walk (). Next () [1]" . Isso ocorre porque o os.walk () usa os.listdir () internamente. De fato, se você testá-los juntos:
A filtragem de os.listdir () é muito ligeiramente mais rápida.
fonte
scandir
pacote - está disponível para o Python 2.6, como um pacote instalável no PyPI. Oferece substituiçõesos.walk
eos.listdir
que são muito mais rápidas.Uma maneira muito mais simples e elegante é usar isso:
Execute esse script na mesma pasta para a qual você deseja nomes de pastas. Ele fornecerá exatamente o nome imediato das pastas (isso também sem o caminho completo das pastas).
fonte
Usando a compreensão da lista,
Eu acho que é a maneira mais simples
fonte
sendo um novato aqui, ainda não posso comentar diretamente, mas aqui está uma pequena correção que gostaria de adicionar à parte seguinte do resposta ΤΖΩΤΖΙΟΥ :
para quem ainda está em python <2.4 : a construção interna precisa ser uma lista em vez de uma tupla e, portanto, deve ser assim:
caso contrário, obtém-se um erro de sintaxe.
fonte
fonte
Para uma lista de nomes de caminhos completos, prefiro esta versão às outras soluções aqui:
fonte
fonte
Uma opção mais segura que não falha quando não há diretório.
fonte
Igual a?
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:fonte
fonte