Deleteing empty directories

CinnamonDonkey CinnamonDonkey at googlemail.com
Mon Mar 30 17:14:55 CEST 2009


My understanding was that rmtree removes a whole tree not just the
empty directories?

eg.

root
 - file1
 - file2
 - dir1
 - dir2
  - file3
  - dir3

I would expect; dir1 and dir3 to be deleted and nothing else touched.

My attempt came up with:

import os
import shutil

def isDirEmpty( path ):
    if not os.path.isdir( path ):
        return False

    contents = os.listdir( path )

    if len(contents) == 0:
        return True

    return False


def RecurseTree( path ):
    if not os.path.isdir( path ):
        return False

    contents = os.listdir( path )

    if len(contents) == 0:
        print "Deleting Empty Dir '%s'" % (path,)
        #shutil.rmtree(path)

    else:
        for item in contents:
            investigate = "%s\\%s" % (path, item)
            if os.path.isdir(investigate):
                RecurseTree( investigate )


if __name__ == '__main__':
    RecurseTree( r"c:\temp" )


But I'm not sure what the max recursion depth is in python? Plus I
think this could be more efficient.




On 30 Mar, 15:59, Tim Golden <m... at timgolden.me.uk> wrote:
> CinnamonDonkey wrote:
> > Hi All,
>
> > I've been scratching my head all afternoon trying to work out the best/
> > quickest way is to delete empty directories within a tree (Windows).
>
> > I've looked at os.walk() but it seems to traverse the directory tree
> > in the wrong order (is it possible to reverse the order?)
>
> > It seems the only way is to manually walk the tree myself recursively
> > and then back up deleteing a directory if it is found to be empty.
>
> In general, the place to look for these things in the
> stdlib is usually shutil. (Slightly awkward that
> "shell" in Windows means everything that happens on
> the desktop, while "shell" in Unix means everything
> *except* what happens on the desktop! This is the
> Unix meaning.)
>
> And sure enough...
>
> """
> rmtree( path[, ignore_errors[, onerror]])
>
> Delete an entire directory tree (path must point to a directory). If ignore_errors is true, errors resulting from failed removals will be ignored; if false or omitted, such errors are handled by calling a handler specified by onerror or, if that is omitted, they raise an exception.
> If onerror is provided, it must be a callable that accepts three parameters: function, path, and excinfo. The first parameter, function, is the function which raised the exception; it will be os.listdir(), os.remove() or os.rmdir(). The second parameter, path, will be the path name passed to function. The third parameter, excinfo, will be the exception information return by sys.exc_info(). Exceptions raised by onerror will not be caught.
>
> """
>
> TJG




More information about the Python-list mailing list