Jorge Louis De Castro wrote:
> Hi all,
> 
> I have the following code to traverse a directory structure from a given 
> path:
> 
> import os, fnmatch, re
> folders = []
> r = re.compile(r'file_filter') # msn_username is passed by the user
> 
> def browse(junk, dirpath, namelist):
>   for name in namelist:
>     if r.search(name):
>       folders.append(os.path.join(dirpath, name))
> 
> userbase = os.environ['USERPROFILE']
> # change directory to user profile folder
> os.chdir(userbase)
> os.path.walk(os.getcwd(), browse, None)
> 
> Now with the sample above I need global variables ("folders") to keep track 
> of the directories traversed. Ideally I'd like to either have the browse 
> function return a value that I could use or I'd like the ability to pass on 
> arguments to the browse function, which I can't seem to be able to.

os.path.walk() has a facility to pass a user argument to the visit() function. 
From the docs:
walk(path, visit, arg)
    Calls the function visit with arguments (arg, dirname, names) for each 
directory in the directory tree rooted at path (including path itself, if it is 
a directory).

Note that the third argument to walk(), is passed as the first argument to 
visit(). 
In your case, you should call
os.path.walk(os.getcwd(), browse, folders)

and define browse() as
def browse(folders, dirpath, namelist):

You could pass the regex as an argument also by making args the tuple (r, 
folders):
os.path.walk(os.getcwd(), browse, (r, folders))
def browse((r, folders), dirpath, namelist):

(Yes, you can do tuple unpacking in a def!)


You might also like to look at os.walk() which is easier to use. Instead of 
needing a callback, it generates a sequence that you use in a for loop. Your 
code would look like this:

import os, fnmatch, re
folders = []
r = re.compile(r'file_filter') # msn_username is passed by the user

userbase = os.environ['USERPROFILE']
# change directory to user profile folder
os.chdir(userbase)
for dirpath, dirnames, filenames in os.walk(os.getcwd()):
  for name in dirnames:
    if r.search(name):
      folders.append(os.path.join(dirpath, name))

(Note this version isn't quite the same as yours; it only finds folders 
matching the name. I'm guessing that is what you want.)

Kent

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to