[Tutor] Re: glob or filter help
Javier Ruere
javier at ruere.com.ar
Sat Jan 22 08:10:29 CET 2005
Jay Loden wrote:
> I have the following code in my updates script (gets the five most recent
> updated files on my site)
>
> def get_fles(exts, upd_dir):
> '''return list of all the files matching any extensions in list exts'''
> fle_list = []
> for each in exts:
> cmd = upd_dir + "*." + each
> ext_ls = glob.glob(cmd)
> fle_list = fle_list + ext_ls
> return filter(notlink, fle_list)
>
> I wanted to just get one list, of all the .htm and .exe files in my upd_dir.
> I was trying to make a far more elegant solution that what's above, that
> could generate a list through a filter. Is there a way to trim the code down
> to something that does ONE sort through the directory and picks up the .htm
> and .exe files? (note, it is not necessary for this to recurse through
> subdirectories in the upd_dir). I have cmd defined above because calling
> "glob.glob(upd_dir + "*." + each) returned the error "cannot concatenate
> string and list objects" - is this the only way around that, or is there a
> better way?
How about:
>>> import os
>>> exts = ('gz', 'conf')
>>> upd_dir = '.'
>>> filter(lambda fn : fn.split('.')[-1] in exts, os.listdir(upd_dir))
Do you like this better. It doesn't use glob and is terse.
> Also in the above code, "notlink" is just a function that returns True if
> "islink()" returns true....there has to be a better way to use this with
> filter(), how can i make filter use "if islink()!=true" as its condition?
If the filter criteria is complex, it deserves it's own function:
>>> import os
>>> import os.path
>>> def get_files(exts, upd_dir):
... def criteria(filename):
... return filename.split('.')[-1] in exts \
... and not os.path.islink(filename)
... return filter(criteria, os.listdir(upd_dir))
...
>>> get_files(('gz', 'conf'), '.')
['dynfun.pdf.gz', 'twander-3.160.tar.gz', 'PyCon2004DocTestUnit.pdf.gz',
'arg23.txt.gz', '.fonts.conf']
Javier
More information about the Tutor
mailing list