Reputation: 2412
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
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