more os.walk() issues... probably user error

rbt rbt at athop1.ath.vt.edu
Wed Feb 16 14:43:11 EST 2005


Kent Johnson wrote:
> rbt wrote:
> 
>> rbt wrote:
>>
>>> This function is intended to remove unwanted files and dirs from 
>>> os.walk(). It will return correctly *IF* I leave the 'for fs in 
>>> fs_objects' statement out (basically leave out the entire purpose of 
>>> the function).
>>>
>>> It's odd, when the program goes into that statment... even when only 
>>> a 'pass', and nothing else is present, nothing is returned. Why is 
>>> that? I'm testing Python 2.4 on Linux x86 and WinXP. Results are the 
>>> same on either platform.
>>>
>>>     def build_clean_list(self, path):
>>>
>>>         file_skip_list = ['search_results.txt']
>>>         dir_skip_list = ['dev', 'proc', 'Temporary Internet Files']
>>>
>>>         fs_objects = os.walk(path, topdown=True)
> 
> 
> fs_objects is a generator, not a list. This loop is exhausting 
> fs_objects, so when you return fs_objects is at the end of iteration, 
> there is nothing left.

That makes sense. Thanks for the explanation. I've never used generators 
before.

> 
>>> ##      for fs in fs_objects:
>>> ##
>>> ##            for f in fs[2]:
>>> ##                if f in file_skip_list:
>>> ##                    print f
>>> ##                    fs[2].remove(f)
>>> ##
>>> ##            for d in fs[1]:
>>> ##                if d in dir_skip_list:
>>> ##                    print d
>>> ##                    fs[1].remove(d)
> 
> 
> Add this here:
>                  yield fs
> 
> and take out the return. This turns build_clean_list() into a generator 
> function and you will be able to iterate the result.

I'll try this.

Will the changes I made (file and dir removals from os.walk()) be 
reflected in the generator object? Is it safe to remove objects this way 
and pass the results in a generator on to another function? Sorry for 
all the questions, I just like to fully understand something before I 
start doing it with confidence.

rbt


> 
> Kent
> 
>>>
>>>         return fs_objects
>>>
>>>
>>
>> Just to clarify, it's wrong of me to say that 'nothing is returned'... 
>> in either case, this is what is returned:
>>
>> Here's what was returned and its type:
>> ----------------------------------------
>> <generator object at 0x407dbe4c>
>> <type 'generator'>
>> ----------------------------------------
>>
>> But, I can't iterate over the returned object when I descend into the 
>> for statement I mentioned above.
>>



More information about the Python-list mailing list