walk directory & ignore all files/directories begin with '.'

Tim Chase python.list at tim.thechases.com
Thu May 13 20:35:59 EDT 2010


On 05/13/2010 12:58 PM, albert kao wrote:
> I want to walk a directory and ignore all the files or directories
> which names begin in '.' (e.g. '.svn').
> Then I will process all the files.
> My test program walknodot.py does not do the job yet.
> Python version is 3.1 on windows XP.
> Please help.
>
> [code]
> #!c:/Python31/python.exe -u
> import os
> import re
>
> path = "C:\\test\\com.comp.hw.prod.proj.war\\bin"
> for dirpath, dirs, files in os.walk(path):
>      print ("dirpath " + dirpath)
>      p = re.compile('\\\.(\w)+$')
>      if p.match(dirpath):
>          continue
>      print ("dirpath " + dirpath)
>      for dir in dirs:
>          print ("dir " + dir)
>          if dir.startswith('.'):
>              continue
>
>          print (files)
>          for filename in files:
>              print ("filename " + filename)
>              if filename.startswith('.'):
>                  continue
>              print ("dirpath filename " + dirpath + "\\" + filename)
>      	    # process the files here
> [/code]
>
> C:\python>walknodot.py
> dirpath C:\test\com.comp.hw.prod.proj.war\bin
> dirpath C:\test\com.comp.hw.prod.proj.war\bin
> dir .svn
> dir com
> []
> dirpath C:\test\com.comp.hw.prod.proj.war\bin\.svn
> dirpath C:\test\com.comp.hw.prod.proj.war\bin\.svn
> ...
>
> I do not expect C:\test\com.comp.hw.prod.proj.war\bin\.svn to appear
> twice.

Note that the first time .svn appears, it's as "dir .svn" while 
the second time it appears, it's via "dirpath ...\.svn"

If you don't modify the list of dirs in place, os.walk will 
descend into all the dirs by default.  (Also, you shouldn't mask 
the built-in dir() function by naming your variables "dir")

While it can be detected with regexps, I like the clarity of just 
using ".startswith()" on the strings, producing something like:

   for curdir, dirs, files in os.walk(root):
     # modify "dirs" in place to prevent
     # future code in os.walk from seeing those
     # that start with "."
     dirs[:] = [d for d in dirs if not d.startswith('.')]

     print curdir
     for f in files:
       if f.startswith('.'): continue
       print (os.path.join(curdir, f))

-tkc






More information about the Python-list mailing list