2009/6/10 spir <denis.s...@free.fr>:
> A foolow-up ;-) from previous question about glob.glob().

Hopefully no misunderstanding this time :-)

> I need to 'glob' files recursively from a top dir (parameter). Tried to use 
> os.walk, but the structure of its return value is really unhandy for such a 
> use (strange, because it seems to me this precise use is typical). On the 
> other hand, os.path.walk seemed to meet my needs, but it is deprecated.

Is it really derecated? It is still in the 3.0 docs with no mention of this..

> I'd like to know if there are standard tools to do that. And your comments on 
> the 2 approaches below.

Well, this is what I came up with which I am sure someone can improve on.

>>> patern = '*.txt'
>>> topdir = 'C:\\GTK\\'
>>> textfiles = [f[0] for f in [glob.glob(os.path.join(d[0], patern)) for d in 
>>> os.walk(topdir)] if f]
>>> textfiles
['C:\\GTK\\license.txt']

Greets
Sander


> -1- I first wrote the following recurseDirGlob() tool func.
>
> ========================================================
> import os, glob
>
> def dirGlob(dir, pattern):
>        ''' File names matching pattern in directory dir. '''
>        fullPattern = os.path.join(dir,pattern)
>        return glob.glob(fullPattern)
>
> def recurseDirGlob(topdir=None, pattern="*.*", nest=False, verbose=False):
>        '''  '''
>        allFilenames = list()
>        # current dir
>        if verbose:
>                print "*** %s" %topdir
>        if topdir is None: topdir = os.getcwd()
>        filenames = dirGlob(topdir, pattern)
>        if verbose:
>                for filename in [os.path.basename(d) for d in filenames]:
>                        print "   %s" %filename
>        allFilenames.extend(filenames)
>        # possible sub dirs
>        names = [os.path.join(topdir, dir) for dir in os.listdir(topdir)]
>        dirs = [n for n in names if os.path.isdir(n)]
>        if verbose:
>                print "--> %s" % [os.path.basename(d) for d in dirs]
>        if len(dirs) > 0:
>                for dir in dirs:
>                        filenames = recurseDirGlob(dir, pattern, nest, verbose)
>                        if nest:
>                                allFilenames.append(filenames)
>                        else:
>                                allFilenames.extend(filenames)
>        # final result
>        return allFilenames
> ========================================================
>
> Example with the following dir structure ; the version with nest=True will 
> recursively nest files from subdirs.
>
> ========================================================
> d0
>        d01
>        d02
>                d020
> 2 .txt files and 1 with a different pattern, in each dir
>
> recurseDirGlob("/home/spir/prog/d0", "*.txt", verbose=True) -->
> *** /home/spir/prog/d0
>   t01.txt
>   t02.txt
> --> ['d01', 'd02']
> *** /home/spir/prog/d0/d01
>   t011.txt
>   t012.txt
> --> []
> *** /home/spir/prog/d0/d02
>   t021.txt
>   t022.txt
> --> ['d020']
> *** /home/spir/prog/d0/d02/d020
>   t0201.txt
>   t0202.txt
> --> []
> ['/home/spir/prog/d0/t01.txt', '/home/spir/prog/d0/t02.txt', 
> '/home/spir/prog/d0/d01/t011.txt', '/home/spir/prog/d0/d01/t012.txt', 
> '/home/spir/prog/d0/d02/t021.txt', '/home/spir/prog/d0/d02/t022.txt', 
> '/home/spir/prog/d0/d02/d020/t0201.txt', 
> '/home/spir/prog/d0/d02/d020/t0202.txt']
>
> recurseDirGlob("/home/spir/prog/d0", "*.txt") -->
> ['/home/spir/prog/d0/t01.txt', '/home/spir/prog/d0/t02.txt', 
> '/home/spir/prog/d0/d01/t011.txt', '/home/spir/prog/d0/d01/t012.txt', 
> '/home/spir/prog/d0/d02/t021.txt', '/home/spir/prog/d0/d02/t022.txt', 
> '/home/spir/prog/d0/d02/d020/t0201.txt', 
> '/home/spir/prog/d0/d02/d020/t0202.txt']
>
> recurseDirGlob("/home/spir/prog/d0", "*.txt", nest=True) -->
> ['/home/spir/prog/d0/t01.txt', '/home/spir/prog/d0/t02.txt', 
> ['/home/spir/prog/d0/d01/t011.txt', '/home/spir/prog/d0/d01/t012.txt'], 
> ['/home/spir/prog/d0/d02/t021.txt', '/home/spir/prog/d0/d02/t022.txt', 
> ['/home/spir/prog/d0/d02/d020/t0201.txt', 
> '/home/spir/prog/d0/d02/d020/t0202.txt']]]
> ========================================================
>
>
>
> -2- Another approach was to build a general 'dirWalk' tool func, similar to 
> os.path.walk:
>
> ========================================================
> def dirWalk(topdir=None, func=None, args=[], nest=False, verbose=False):
>        '''  '''
>        allResults = list()
>        # current dir
>        if verbose:
>                print "*** %s" %topdir
>        if topdir is None: topdir = os.getcwd()
>        results = func(topdir, *args)
>        if verbose:
>                print "    %s" % results
>        allResults.extend(results)
>        # possible sub dirs
>        names = [os.path.join(topdir, dir) for dir in os.listdir(topdir)]
>        dirs = [n for n in names if os.path.isdir(n)]
>        if verbose:
>                print "--> %s" % [os.path.basename(d) for d in dirs]
>        if len(dirs) > 0:
>                for dir in dirs:
>                        results = dirWalk(dir, func, args, nest, verbose)
>                        if nest:
>                                allResults.append(results)
>                        else:
>                                allResults.extend(results)
>        # final allResults
>        return allResults
> ========================================================
>
> Example uses to bring the same results, calling dirGlob, would be:
>
> dirWalk("/home/spir/prog/d0", dirGlob, args=["*.txt"], verbose=True) -->
> dirWalk("/home/spir/prog/d0", dirGlob, args=["*.txt"])
> dirWalk("/home/spir/prog/d0", dirGlob, args=["*.txt"], nest=True)
>
> Denis
> ------
> la vita e estrany
> _______________________________________________
> Tutor maillist  -  tu...@python.org
> http://mail.python.org/mailman/listinfo/tutor
>
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to