[Tutor] Request for help with os.walk() combining os.path.ismount() in Linux

Srihari Vijayaraghavan linux.bug.reporting at gmail.com
Thu Aug 20 11:16:51 CEST 2015


On 20 August 2015 at 18:51, Srihari Vijayaraghavan
<linux.bug.reporting at gmail.com> wrote:
> On 20 August 2015 at 18:25, Alan Gauld <alan.gauld at btinternet.com> wrote:
>> On 20/08/15 04:03, Srihari Vijayaraghavan wrote:
>>
>>> out = sys.stdout.write
>>> for root, dirs, files in os.walk("/"):
>>>     out("The dirs before removing mount points: %s\n" % dirs)
>>>     for d in dirs:
>>>         dname = os.path.join(root, d)
>>>         if os.path.ismount(dname):
>>>             dirs.remove(d)
>>
>>
>> It's never a good idea to remove items from the thing
>> you are iterating over. Create a copy of dirs (dirs[:])
>> to iterate on then remove the items from the original
>> dirs.
>
> In general I agree, but this is what the os.walk() document states:
> "... When topdown is True, the caller can modify the dirnames list
> in-place (perhaps using del or slice assignment)..."
>
> (Yes, the topdown argument of os.walk() is True by default, until
> manually modified.)
>
> Therefore I see no problem with in-place modification of dirnames.
> I've made a copy of dirs & iterated over it, which made no difference
> in my case.
>

Sorry to reply to my own email.

I stand corrected. Indeed, while iterating over dirs (in the above
example) & doing in-place modification was the source of the problem,
giving unpredictable outcome. While iterating over its copy & updating
the original dirs, gives expected results.

Perhaps my interpretation of the document wasn't correct. Anyway, it's
working now.

Thank you folks, especially Alan.

-- 
Srihari Vijayaraghavan


More information about the Tutor mailing list