Я пишу сценарий, который спускается в дерево каталогов (используя os.walk ()), а затем посещает каждый файл, соответствующий определенному расширению файла. Однако, поскольку некоторые из деревьев каталогов, в которых будет использоваться мой инструмент, также содержат подкаталоги, которые, в свою очередь, содержат МНОГО бесполезного (для целей этого сценария) материала, я решил добавить опцию для пользователя, чтобы указать список каталогов для исключения из обхода.
Это достаточно просто с os.walk (). В конце концов, я должен решить, хочу ли я на самом деле посетить соответствующие файлы / каталоги, созданные os.walk (), или просто пропустить их. Проблема в том, что если у меня есть, например, дерево каталогов, подобное этому:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
и я хочу исключить uselessStuff и все его дочерние элементы, os.walk () все равно попадет во все (потенциально тысячи) подкаталоги uselessStuff , что, разумеется, сильно замедляет работу. В идеальном мире я мог бы сказать os.walk (), чтобы он даже не потрудился дать потомство детям uselessStuff , но, насколько мне известно, нет способа сделать это (есть?).
У кого-нибудь есть идея? Может быть, есть сторонняя библиотека, которая предоставляет что-то подобное?
dirs[:] =
?dirs[:] = value
изменяетdirs
на месте . Он изменяет содержимое спискаdirs
без изменения контейнера. Как ужеhelp(os.walk)
упоминалось, это необходимо, если вы хотите повлиять на способos.walk
обхода подкаталогов. (dirs = value
просто переназначает (или «привязывает») переменнуюdirs
к новому списку, без изменения оригиналаdirs
.)filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
и возвращаетroot, dirs, files
после исключения.git
(или чего-либо еще)dirs
.... альтернативная форма превосходного ответа @ unutbu, которая читает немного более прямо, учитывая, что цель состоит в том, чтобы исключить каталоги, за счет времени O (n ** 2) против O (n).
(Для
list(dirs)
правильного выполнения требуется сделать копию списка директорий с помощью )источник
dirs[:] = set(dirs) - exclude
. По крайней мере, это все еще \ $ O (n) \ $, и вы не строите понимание только для его побочных эффектов ...for d in list(dirs)
немного странноdirs
это уже список. И то, что у вас есть, на самом деле не является списком.dirs.remove(d)
ничего не возвращает, так что вы получите полный списокNone
s. Я согласен с @Torsten.