Christopher Spears wrote:
> I rewrote my code with Alan's suggestions in mind.
>
> #!/usr/bin/python
>
> import os, os.path, glob
>
> def glob_files(pattern, base_path = '.'):
>       abs_base = os.path.abspath(base_path)
>       #path_list = []
>       #path_list.append(abs_base)
>       globbed_dict = {}
>       cwd = os.getcwd()
>       for root,dirs,files in os.walk(abs_base):
>               for name in dirs:
>                       path = os.path.join(root, name)
>                       print path
>                       os.chdir(path)
>                       matched_files = glob.glob(pattern)
>                       #print matched_files
>                       if matched_files != []:
>                               globbed_dict[path] = matched_files
>                       os.chdir(abs_base)
>       os.chdir(cwd)
>       return globbed_dict
>       
> if __name__ == "__main__":
>       base_path = raw_input("Enter a base path: ")
>       pattern = raw_input("Enter a glob pattern: ")
>       
>       str(base_path)
>       str(pattern)
>       
>       globbed_dict = glob_files(pattern, base_path)
>       
>       print globbed_dict
>
> However, the code still doesn't do exactly what I
> want.
>
> $ ./~/chris_python 126> ./find_items_01.py
> Enter a base path: ./LearningToProgram
> Enter a glob pattern: *.pyc
> {}
>
> Under the LearningToProgram directory is a test
> directory that doesn't contain any .pyc files, so the
> script's returned value is correct.  However, .pyc
> files exist in the LearningToProgram directory, and I
> would like to put those files in the dictionary too. 
> Is there an elegant way to accomplish this?

The base_path directory will never appear in the dirs list from 
os.walk(). It will be returned as the root directory however. You could 
modify your program to glob the root directory instead of the list of 
dirs. Or use fnmatch.fnmatch() or fnmatch.filter(), which I still think 
is a better solution if you aren't married to glob():

import os, fnmatch

def glob_files(pattern, base_path = '.'):
        abs_base = os.path.abspath(base_path)
        globbed_dict = {}
        for root,dirs,files in os.walk(abs_base):
                matched_files = [ os.path.join(root, name) for name in 
fnmatch.filter(files, pattern) ]

                if matched_files: # Note: no need to compare to []
                        globbed_dict[root] = matched_files
        return globbed_dict

Kent

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

Reply via email to