Hack with os.walk()

Frans Englich frans.englich at telia.com
Fri Feb 11 19:00:12 EST 2005


Hello,

Have a look at this recursive function:

def walkDirectory( directory, element ):

    element = element.newChild( None, "directory", None ) # automatically 
appends to parent
    element.setProp( "name", os.path.basename(directory))

    for root, dirs, files in os.walk( directory ):

        for fileName in files:
            element.addChild( parseFile( os.path.join( root, fileName ))

        for dirName in filter( acceptDirectory, dirs):
            walkDirectory( os.path.join( root, dirName ), element )

        return ### Note, this is inside for loop

What it does, is it recurses through all directories, and, with libxml2's 
bindings, builds an XML document which maps directly to the file hierarchy. 
For every file is parseFile() called, which returns a "file element" which is 
appended; the resulting structure looks the way one expect -- like a GUI tree 
view.

The current code works, but I find it hackish, and it probably is inefficient, 
considering that os.walk() is not called once(as it usually is), but for 
every directory level.

My problem, AFAICT, with using os.walk() the usual way, is that in order to 
construct the /hierarchial/ XML document, I need to be aware of the directory 
depth, and a recursive function handles that nicely; os.walk() simply 
concentrates on figuring out paths to all files in a directory, AFAICT.

I guess I could solve it with using os.walk() in a traditional way, by somehow 
pushing libxml2 nodes on a stack, after keeping track of the directory levels 
etc(string parsing..). Or, one could write ones own recursive directory 
parser..

My question is: what is the least ugly? What is the /proper/ solution for my 
problem? How would you write it in the cleanest way?


Cheers,

		Frans




More information about the Python-list mailing list