在Python中os.walk()的奇怪行为?

cin*_*nny 0 python os.walk

这是原始代码块及其结果:

码:

if os.path.isdir(top):
    for root, dirs, files in os.walk(top, topdown = True):
        for dirname in dirs:
            print 'Dirname = ', os.path.join(root, dirname)
Run Code Online (Sandbox Code Playgroud)

结果:

Dirname = ../output/.svn
Dirname = ../output/a random folder
Dirname = ../output/a random folder - copy
Dirname = ../output/.svn\pristine
Dirname = ../output/.svn\temp
Dirname = ../output/.svn\pristine\04
Dirname = ../output/.svn\pristine\59
Dirname = ../output/a random folder\another one inside
Dirname = ../output/a random folder\another one inside - Copy
Dirname = ../output/a random folder\another one inside - Copy (2)
Run Code Online (Sandbox Code Playgroud)

现在我想忽略所有隐藏的文件夹和子文件夹.这是修改后的代码及其结果:

码:

if os.path.isdir(top):
    for root, dirs, files in os.walk(top, topdown = True):
        for dirname in dirs:
            print 'Dirname = ', os.path.join(root, dirname)
            if dirname.startswith('.'):
                dirs.remove(dirname)
Run Code Online (Sandbox Code Playgroud)

结果:

Dirname = ../output/.svn
Dirname = ../output/a random folder - copy
Dirname = ../output/a random folder\another one inside
Dirname = ../output/a random folder\another one inside - Copy
Dirname = ../output/a random folder\another one inside - Copy (2)
Run Code Online (Sandbox Code Playgroud)

我不明白的是:为什么../output/a随机文件夹不再列出?

Ste*_*der 6

在迭代迭代时,不应修改迭代.在这种情况下,您将dirsfor迭代循环内部进行修改dirs.

试试这个:

if os.path.isdir(top):
    for root, dirs, files in os.walk(top, topdown = True):
        dirs_to_ignore = []
        for dirname in dirs:
            print 'Dirname = ', os.path.join(root, dirname)
            if dirname.startswith('.'):
                dirs_to_ignore.append(dirname)
        for dirname in dirs_to_ignore:
            dirs.remove(dirname)
Run Code Online (Sandbox Code Playgroud)

另请参阅:迭代时修改列表

  • 制作一个`dirs_to_keep`列表后跟`dirs [:] = dirs_to_keep`会更短更高效,但这里的性能确实无关紧要. (2认同)