[Tutor] critique my script again!
Kent Johnson
kent37 at tds.net
Fri Aug 4 12:43:22 CEST 2006
Christopher Spears wrote:
> import os, os.path, glob
>
> def create_dict(path, globbed_dict):
> os.chdir(path)
> matched_files = glob.glob(pattern)
> if matched_files != []:
> globbed_dict[path] = matched_files
> return globbed_dict
>
As written create_dict() has the side-effect of changing the working
dir, which you correct for in the caller. A better design would be to
save and restore the correct dir in create_dict() so callers don't have
to know that it has changed.
> def glob_files(pattern, base_path = '.'):
> abs_base = os.path.abspath(base_path)
> globbed_dict = {}
> cwd = os.getcwd()
> #Check the root directory first
> globbed_dict = create_dict(abs_base, globbed_dict)
> #Check other directories
> for root,dirs,files in os.walk(abs_base):
> for name in dirs:
> path = os.path.join(root, name)
> globbed_dict = create_dict(path, globbed_dict)
> os.chdir(abs_base)
> #Make sure the script returns to the user's original
> directory.
> os.chdir(cwd)
> return globbed_dict
>
Rather than special-casing abs_base with its own call to create_dict, I
would have the os.walk() loop act on root instead of dirs:
for root,dirs,files in os.walk(abs_base):
globbed_dict = create_dict(root, globbed_dict)
>
> def print_dict(globbed_dict):
> paths = globbed_dict.keys()
> paths.sort()
> for p in paths:
>
Could be written more succinctly as
for p in sorted(globbed_dict.keys()):
Kent
> print p,": "
> file_list = globbed_dict[p]
> for f in file_list:
> print "\t",f
>
>
> 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_dict(globbed_dict)
>
>
>
>
>
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
>
>
More information about the Tutor
mailing list