Calculating a directory's size using Python? Calculating a directory's size using Python? python python

Calculating a directory's size using Python?


This walks all sub-directories; summing file sizes:

import osdef get_size(start_path = '.'):    total_size = 0    for dirpath, dirnames, filenames in os.walk(start_path):        for f in filenames:            fp = os.path.join(dirpath, f)            # skip if it is symbolic link            if not os.path.islink(fp):                total_size += os.path.getsize(fp)    return total_sizeprint(get_size(), 'bytes')

And a oneliner for fun using os.listdir (Does not include sub-directories):

import ossum(os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f))

Reference:

UpdatedTo use os.path.getsize, this is clearer than using the os.stat().st_size method.

Thanks to ghostdog74 for pointing this out!

os.stat - st_size Gives the size in bytes. Can also be used to get file size and other file related information.

import osnbytes = sum(d.stat().st_size for d in os.scandir('.') if d.is_file())

Update 2018

If you use Python 3.4 or previous then you may consider using the more efficient walk method provided by the third-party scandir package. In Python 3.5 and later, this package has been incorporated into the standard library and os.walk has received the corresponding increase in performance.

Update 2019

Recently I've been using pathlib more and more, here's a pathlib solution:

from pathlib import Pathroot_directory = Path('.')sum(f.stat().st_size for f in root_directory.glob('**/*') if f.is_file())


Some of the approaches suggested so far implement a recursion, others employ a shell or will not produce neatly formatted results. When your code is one-off for Linux platforms, you can get formatting as usual, recursion included, as a one-liner. Except for the print in the last line, it will work for current versions of python2 and python3:

du.py-----#!/usr/bin/python3import subprocessdef du(path):    """disk usage in human readable format (e.g. '2,1GB')"""    return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')if __name__ == "__main__":    print(du('.'))

is simple, efficient and will work for files and multilevel directories:

$ chmod 750 du.py$ ./du.py2,9M


Here is a recursive function (it recursively sums up the size of all subfolders and their respective files) which returns exactly the same bytes as when running "du -sb ." in linux (where the "." means "the current folder"):

import osdef getFolderSize(folder):    total_size = os.path.getsize(folder)    for item in os.listdir(folder):        itempath = os.path.join(folder, item)        if os.path.isfile(itempath):            total_size += os.path.getsize(itempath)        elif os.path.isdir(itempath):            total_size += getFolderSize(itempath)    return total_sizeprint "Size: " + str(getFolderSize("."))