Estou escrevendo um script que desce em uma árvore de diretórios (usando os.walk ()) e depois visita cada arquivo que corresponde a uma determinada extensão de arquivo. No entanto, como algumas das árvores de diretórios em que minha ferramenta será usada também contêm subdiretórios que, por sua vez, contêm MUITO material inútil (para o propósito deste script), achei que adicionaria uma opção para o usuário especificar uma lista de diretórios a serem excluídos da passagem.
Isso é bastante fácil com os.walk (). Afinal, cabe a mim decidir se realmente quero visitar os respectivos arquivos / diretórios gerados por os.walk () ou simplesmente ignorá-los. O problema é que, se eu tenho, por exemplo, uma árvore de diretórios como esta:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
e eu quero excluir uselessStuff e todos os seus filhos, os.walk () ainda descerá para todos os (potencialmente milhares de) subdiretórios do uselessStuff , que, escusado será dizer, diminui bastante as coisas. Em um mundo ideal, eu poderia dizer ao os.walk () que nem se desse ao trabalho de gerar mais filhos de coisas inúteis , mas, pelo que sei , não há como fazer isso (existe?).
Alguém tem alguma ideia? Talvez haja uma biblioteca de terceiros que forneça algo assim?
dirs[:] =
?dirs[:] = value
modificadirs
no local . Ele altera o conteúdo da listadirs
sem alterar o contêiner. Comohelp(os.walk)
mencionado, isso é necessário se você deseja afetar a maneira comoos.walk
percorre os subdiretórios. (dirs = value
apenas reatribui (ou "vincula") a variáveldirs
a uma nova lista, sem modificar o originaldirs
.)filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
e geraroot, dirs, files
após excluir.git
(ou o que mais você desejar)dirs
.... uma forma alternativa da excelente resposta do @ unutbu que lê um pouco mais diretamente, considerando que a intenção é excluir diretórios, ao custo de O (n ** 2) vs O (n).
(É necessário fazer uma cópia da lista de diretórios
list(dirs)
para a execução correta)fonte
dirs[:] = set(dirs) - exclude
. Pelo menos ainda é \ $ O (n) \ $ e você não construir uma compreensão apenas por seus efeitos secundários ...for d in list(dirs)
é um pouco estranho.dirs
já é uma lista. E o que você tem não é realmente uma compreensão de lista.dirs.remove(d)
não retorna nada, então você acaba com uma lista cheia deNone
s. Eu concordo com @Torsten.