Welcome, guest | Sign In | My Account | Store | Cart
"""
Walker encapsulates os.walk's directory traversal as an object with 
the added features of excluded directories and a hook for calling 
an outside function to act on each file.  Walker can easily be 
subclassed for more functionality.

ReWalker filters filenames in traversal by a regular expression.

Jack Trainor 2007
"""
import os, os.path
import re

class Walker(object):
    def __init__(self, dir, executeHook=None, excludeDirs=[]):
        self.dir = dir
        self.executeHook = executeHook
        self.excludeDirs = excludeDirs
        
    def isValidFile(self, fileName):
        return True
        
    def isValidDir(self, dir):
        head, tail = os.path.split(dir)
        valid = (not tail in self.excludeDirs)
        return valid
                  
    def executeFile(self, path):
        if self.executeHook:
            self.executeHook(self, path)
        # else subclass Walker and override executeFile
            
    def execute(self):
        for root, dirs, fileNames in os.walk(self.dir):
            for fileName in fileNames:
                if self.isValidDir(root) and self.isValidFile(fileName):
                    path = os.path.join(root, fileName)
                    self.executeFile(path)
        return self 
    
class ReWalker(Walker):
    def __init__(self, dir, fileMatchRe, executeHook=None, excludeDirs=[]):
        Walker.__init__(self, dir, executeHook, excludeDirs)
        self.fileMatchPat = re.compile(fileMatchRe)

    def isValidFile(self, fileName):
        return self.fileMatchPat.match(fileName)

#######################################################
""" For testing: """
def RenameFile(path, matchRe, subRe):
    dir, name = os.path.split(path)
    newName = re.sub(matchRe, subRe, name)
    if newName != name:
        print "%s -> %s" % (name, newName)
        newPath = os.path.join(dir, newName)
        os.rename(path, newPath)

def Rename1(walker, path):
    RenameFile(path, r"(.*)\.pyc$", r"#\1.pyc#")

def Rename2(walker, path):
    RenameFile(path, r"#(.*)\.pyc#$", r"\1.pyc")

def Test():
    """ renames pyc files to #.*pyc# then restores them back again """
    walker = ReWalker(r"C:\Dev\Copy of PyUtils", r".*\.pyc$", Rename1, [".svn"]).execute()
    walker = ReWalker(r"C:\Dev\Copy of PyUtils", r".*\.pyc#$", Rename2, [".svn"]).execute()


if __name__ == "__main__":
    Test()
    

History

  • revision 2 (16 years ago)
  • previous revisions are not available