Документация os.walk
(http://docs.python.org/library/os.html? Highlight = os.walk # os.walk), говорит, что я могу пропустить обход нежелательных каталогов, удалив их из списка директорий. Явный пример из документов:Ошибка в os.walk Python?
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
print root, "consumes",
print sum(getsize(join(root, name)) for name in files),
print "bytes in", len(files), "non-directory files"
if 'CVS' in dirs:
dirs.remove('CVS') # don't visit CVS directories
Я вижу другое поведение (используя ActivePython 2.6.2). А именно для кода:
>>> for root,dirs,files in os.walk(baseline):
... if root.endswith(baseline):
... for d in dirs:
... print "DIR: %s" % d
... if not d.startswith("keep_"):
... print "Removing %s\\%s" % (root,d)
... dirs.remove(d)
...
... print "ROOT: %s" % root
...
Я получаю результат:
DIR: two
Removing: two
DIR: thr33
Removing: thr33
DIR: keep_me
DIR: keep_me_too
DIR: keep_all_of_us
ROOT: \\mach\dirs
ROOT: \\mach\dirs\ONE
ROOT: \\mach\dirs\ONE\FurtherRubbish
ROOT: \\mach\dirs\ONE\FurtherRubbish\blah
ROOT: \\mach\dirs\ONE\FurtherRubbish\blah\Extracted
ROOT: \\mach\dirs\ONE\FurtherRubbish\blah2\Extracted\Stuff_1
...
WTF? Почему не удалили \\mach\dirs\ONE
? Это явно не начинается с «keep_».
То, что он сказал. Обратите внимание на пример, что они изменяют список 'dirs' ПЕРЕД тем, как они перебирают его. – jathanism
@jathanism: они вообще не перебирают 'dirs';) – SilentGhost
Ну нет в примере кода, нет. Но предполагается, что это было бы, пожалуй, больше. – jathanism