Como faço os.walk
para limitar para retornar apenas arquivos no diretório que eu forneço?
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
for f in files:
if os.path.splitext(f)[1] in whitelist:
outputList.append(os.path.join(root, f))
else:
self._email_to_("ignore")
return outputList
files_with_full_path = [f.path for f in os.scandir(dir) if f.is_file()]
. Caso você precise apenas dos nomes dos arquivos, use emf.name
vez def.path
. Essa é a solução mais rápida e muito mais rápida do que qualquer outrawalk
oulistdir
, consulte stackoverflow.com/a/40347279/2441026 .Respostas:
Use a
walklevel
função.Funciona da mesma forma
os.walk
, mas você pode passar umlevel
parâmetro que indica a profundidade da recursão.fonte
dirs = []
edirs = None
mas aqueles não funcionou.map(dirs.remove, dirs)
funcionou, mas com algumas mensagens indesejadas '[Nenhum]' impressas. Então, por quedel dirs[:]
especificamente?topdown=False
em os.walk. Veja o 4º parágrafo nos documentos :Modifying dirnames when topdown is False has no effect on the behavior of the walk, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.
dirs = []
edirs = None
não funcionará porque eles apenas criam um novo objeto não relacionado e atribuem ao nomedirs
. O objeto de lista original precisa ser modificado no local, não o nomedirs
.Não use os.walk.
Exemplo:
fonte
os.path.isfile
eos.path.isdir
permite diferenciar. Não entendi, poisos.path.isfile
está no código de amostra desde '08 e seu comentário é de '16. Esta é claramente a melhor resposta, já que você não pretende percorrer um diretório, mas listá-lo.walk
fornece imediatamente as listas separadas de diretórios e arquivos..next()
) e está muito mais próxima da sua ideia.os.scandir
função que permite uma interação mais sofisticada de arquivo ou diretório-objeto. Veja minha resposta abaixoAcho que a solução é muito simples.
usar
para fazer apenas a primeira iteração do loop for, deve haver uma maneira mais elegante.
A primeira vez que você chama os.walk, ele retorna tulipas para o diretório atual e, no próximo loop, o conteúdo do próximo diretório.
Pegue o roteiro original e apenas adicione uma pausa .
fonte
A sugestão de uso
listdir
é boa. A resposta direta à sua pergunta no Python 2 éroot, dirs, files = os.walk(dir_name).next()
.A sintaxe Python 3 equivalente é
root, dirs, files = next(os.walk(dir_name))
fonte
root, dirs, files = os.walk(dir_name).next()
dá-meAttributeError: 'generator' object has no attribute 'next'
root, dirs, files = next(os.walk(dir_name))
e então as variáveisroot, dirs, files
corresponderão apenas às variáveis do gerador nodir_name
nível.Você pode usar o
os.listdir()
qual retorna uma lista de nomes (para arquivos e diretórios) em um determinado diretório. Se você precisar distinguir entre arquivos e diretórios, chameos.stat()
cada nome.fonte
Se você tiver requisitos mais complexos do que apenas o diretório superior (por exemplo, ignore os diretórios VCS, etc.), você também pode modificar a lista de diretórios para evitar que os.walk volte a eles.
ie:
Observação - tome cuidado para alterar a lista, em vez de apenas religá-la. Obviamente, o os.walk não sabe sobre a religação externa.
fonte
fonte
A mesma ideia
listdir
, mas mais curta:fonte
Tive vontade de jogar meus 2 centavos.
fonte
No Python 3, consegui fazer isso:
fonte
Desde Python 3.5, você pode usar em
os.scandir
vez deos.listdir
. Em vez de strings, você obtém um iterador deDirEntry
objetos em retorno. Dos documentos:Você pode acessar o nome do objeto por meio do
DirEntry.name
qual é então equivalente à saída deos.listdir
fonte
scandir()
, pois é muito mais rápido do quelistdir()
. Veja benchmarks aqui: stackoverflow.com/a/40347279/2441026 .Você também pode fazer o seguinte:
fonte
Foi assim que resolvi
fonte
Há um problema ao usar listdir. O os.path.isdir (identificador) deve ser um caminho absoluto. Para escolher subdiretórios, você:
A alternativa é mudar para o diretório para fazer o teste sem o os.path.join ().
fonte
Você pode usar este snippet
fonte
crie uma lista de exclusões, use fnmatch para pular a estrutura de diretório e fazer o processo
o mesmo que para 'inclui':
fonte
Por que não usar simplesmente um
range
eos.walk
combinado com ozip
? Não é a melhor solução, mas também funcionaria.Por exemplo, assim:
Funciona para mim no python 3.
Além disso: A
break
é mais simples, aliás. (Veja a resposta de @Pieter)fonte
Uma ligeira mudança na resposta de Alex, mas usando
__next__()
:print(next(os.walk('d:/'))[2])
ouprint(os.walk('d:/').__next__()[2])
com a
[2]
ser ofile
noroot, dirs, file
mencionado em outras respostasfonte
A pasta raiz muda para cada diretório que os.walk encontrar. Eu resolvo isso verificando se root == diretório
fonte
fonte