cinny
cinny

Reputation: 2412

Strange behavior of os.walk() in Python?

This is the original block of code and its result:

Code:

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)

Results:

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)

Now I want to ignore all hidden folders and subfolders. This is the modified code and its result:

Code:

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)

Result:

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)

What I don't understand is: why is ../output/a random folder not listed anymore??

Upvotes: 0

Views: 2110

Answers (1)

Steven T. Snyder
Steven T. Snyder

Reputation: 6177

You should not modify an iterable while you're iterating over it. In this case, you're modifying dirs inside of a for loop that iterates over dirs.

Try this instead:

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)

See also: Modifying list while iterating

Upvotes: 6

Related Questions