Welcome, guest | Sign In | My Account | Store | Cart

This is a new implementation of directory walking inspired by Fredrik Lundh's directoryWalker.py (see http://aspn.activestate.com/ASPN/Mail/Message/541112 ). This code uses a generator instead of a class, so it requires Python 2.2 or above.

Python, 13 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from __future__ import generators

import os

def dirwalk(dir):
    "walk a directory tree, using a generator"
    for f in os.listdir(dir):
        fullpath = os.path.join(dir,f)
        if os.path.isdir(fullpath) and not os.path.islink(fullpath):
            for x in dirwalk(fullpath):  # recurse into subdir
                yield x
        else:
            yield fullpath

Compare this code to the original directoryWalker.py code at http://aspn.activestate.com/ASPN/Mail/Message/541112. By using a recursive generator the concept may be expressed more concisely. (Requires Python 2.2 or above)

6 comments

Tom Good (author) 22 years, 3 months ago  # | flag

oops - typo. there is a typo in the listing, the line that says "for x in directoryWalk(fullpath):" should say "for x in dirwalk(fullpath):"

Tom Good (author) 22 years, 3 months ago  # | flag

fixed the typo mentioned above

Robin Siebler 21 years, 9 months ago  # | flag

How would I use this? I'm new to Python. Can you give an example of how to use this?

Stefano Spinucci 21 years, 5 months ago  # | flag

Example of use. If you want to list the content of the directory "c:\python22" you can use the following code :

for elem in dirwalk("c:\python22"):
        print elem
Bob Costello 17 years, 5 months ago  # | flag

Empty directory paths? Is there a way for this to also yield empty directory paths?

Bob Costello 17 years, 5 months ago  # | flag

Now gives empty directories! I've answered my own request...

def dirwalk(dir, giveDirs=0):
    """
    walk a directory tree, using a generator
    """
    import os

    for f in os.listdir(dir):
        fullpath = os.path.join(dir,f)
        if os.path.isdir(fullpath) and not os.path.islink(fullpath):
            if not len(os.listdir(fullpath)):
                yield fullpath + os.sep
            else:
                for x in dirwalk(fullpath):  # recurse into subdir
                    if os.path.isdir(x):
                        if giveDirs:
                            yield x
                    else:
                        yield x
        else:
            yield fullpath
Created by Tom Good on Fri, 4 Jan 2002 (PSF)
Python recipes (4591)
Tom Good's recipes (4)

Required Modules

Other Information and Tasks