newb question: file searching

John Machin sjmachin at lexicon.net
Tue Aug 8 22:13:46 EDT 2006


jaysherby at gmail.com wrote:
> I do appreciate the advice, but I've got a 12 line function that does
> all of that.  And it works!  I just wish I understood a particular line
> of it.
>
> def getFileList(*extensions):
>     import os
>     imageList = []
>     for dirpath, dirnames, files in os.walk('.'):
> 	    for filename in files:
> 		    name, ext = os.path.splitext(filename)
> 		    if ext.lower() in extensions and not filename.startswith('.'):
> 			    imageList.append(os.path.join(dirpath, filename))
> 	    for dirname in reversed(range(len(dirnames))):
> 		    if dirnames[dirname].startswith('.'):
> 			    del dirnames[dirname]
>
>     return imageList
>
> print getFileList('.jpg', '.gif', '.png')
>
> The line I don't understand is:
> reversed(range(len(dirnames)))
>

For a start, change "dirname" to "dirindex" (without changing
"dirnames"!) in that line and the next two lines -- this may help your
understanding.

The purpose of that loop is to eliminate from dirnames any entries
which start with ".". This needs to be done in-situ -- concocting a new
list and binding the name "dirnames" to it won't work.
The safest understandable way to delete entries from a list while
iterating over it is to do it backwards.

Doing it forwards doesn't always work; example:

#>>> dirnames = ['foo', 'bar', 'zot']
#>>> for x in range(len(dirnames)):
...     if dirnames[x] == 'bar':
...         del dirnames[x]
...
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
IndexError: list index out of range

HTH,
John




More information about the Python-list mailing list