July 2002
Intermediate to advanced
608 pages
15h 46m
English
Credit: Frank Fejes
You need to compute the total size of a directory (or set of directories) in a way that works under both Windows and Unix-like platforms.
There are easier platform-dependent solutions, such as Unix’s du, but Python also makes it quite feasible to have a cross-platform solution:
import os
from os.path import *
class DirSizeError(Exception): pass
def dir_size(start, follow_links=0, start_depth=0, max_depth=0, skip_errs=0):
# Get a list of all names of files and subdirectories in directory start
try: dir_list = os.listdir(start)
except:
# If start is a directory, we probably have permission problems
if os.path.isdir(start):
raise DirSizeError('Cannot list directory %s'%start)
else: # otherwise, just re-raise the error so that it propagates
raise
total = 0L
for item in dir_list:
# Get statistics on each item--file and subdirectory--of start
path = join(start, item)
try: stats = os.stat(path)
except:
if not skip_errs:
raise DirSizeError('Cannot stat %s'%path)
# The size in bytes is in the seventh item of the stats tuple, so:
total += stats[6] # recursive descent if warranted if isdir(path) and (follow_links or not islink(path)): bytes = dir_size(path, follow_links, start_depth+1, max_depth) total += bytes if max_depth and (start_depth < max_depth): print_path(path, bytes) return total def print_path(path, bytes, units='b'): if units == 'k': print '%-8ld%s' % (bytes / 1024, path) elif units == 'm': print ...