Tim Peters wrote:
[Frans Englich]
...

[snip]

class HasPath: def __init__(self, path): self.path = path

    def __lt__(self, other):
        return self.path < other.path

class Directory(HasPath):
    def __init__(self, path):
        HasPath.__init__(self, path)
        self.files = [] # list of File objects
        self.subdirs =  [] # list of sub-Directory objects

class File(HasPath):
    pass

[snip]

def build_tree(path, Directory=Directory, File=File): top = Directory(path) path2dir = {path: top} for root, dirs, files in os.walk(path): dirobj = path2dir[root] for name in dirs: subdirobj = Directory(os.path.join(root, name)) path2dir[subdirobj.path] = subdirobj dirobj.subdirs.append(subdirobj) for name in files: dirobj.files.append(File(os.path.join(root, name))) return top

That looks short and sweet to me.  It could be made shorter, but not
without losing clarity to my eyes.

The aforementioned path class makes this even easier. No need to build the tree - that is done automatically by the path constuctor:


ListingDirectory can then inherit from path.path with few changes:

from path import path

libpath = r"C:\Python24\Lib"

class ListingDirectory(path):
    # Display directory tree as a tree, with 4-space indents.
    # Files listed before subdirectories, both in alphabetical order.
    # Full path displayed for topmost directory, base names for all
    # other entries.  Directories listed with trailing os.sep.
    def display(self, level=0):

        name = self.abspath()   # path method
        if level:
            name = self.basename() # path method
        print "%s%s%s" % (' ' * level, name, os.sep)
        for f in self.files():
            print "%s%s" % (' ' * (level + 4), f.basename())  path method
        for d in self.dirs():  # path.dirs returns an iterator over path objects
            ListingDirectory(d).display(level + 4)

mytree = ListingDirectory(libpath)
mytree.display()

[snip about 15000 lines...]

Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to