11
votes
def size_of_dir(dirname):
    print("Size of directory: ")
    print(os.path.getsize(dirname))

is the code in question. dirname is a directory with 130 files of about 1kb each. When I call this function, it returns 4624, which is NOT the size of the directory...why is this?

4
Joe, it looks to me as if you have two answers that completely answer your question. You should accept one of them, or clarify your question if you think there's something important they haven't dealt with. - Gareth McCaughan

4 Answers

14
votes

This value (4624B) represents the size of the file that describes that directory. Directories are described as inodes (http://en.wikipedia.org/wiki/Inode) that hold information about the files and directories it contains.

To get the number of files/subdirectories inside that path, use:

len(os.listdir(dirname))

To get the total amount of data, you could use the code in this question, that is (as @linker posted)

 sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)]).
6
votes

Using os.path.getsize() will only get you the size of the directory, NOT of its content. So if you call getsize() on any directory you will always get the same size since they are all represented the same way. On contrary, if you call it on a file, it will return the actual file size.

If you want the content you will need to do it recursively, like below:

sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)])
2
votes

The first answer brought me this:

>>> sum([os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f)])
1708

This is also not correct for me :( (I did check my cwd)

The code below brought me a closer result

total_size = 0
for folders, subfolders, files in os.walk(dirname):
    for file in files:
        total_size += os.path.getsize(os.path.join(folders, file))
print(total_size)
-2
votes
import os

def create_python_script(filename):
    comments = "# Start of a new Python Program"
    #filesize = 0
    with open(filename, 'w') as new_file:
        new_file.write(comments)
        cwd=os.getcwd()
        fpath = os.path.abspath(filename)
        filesize=os.path.getsize(fpath)
    return(filesize)

print(create_python_script('newprogram.py'))

it should 31 bytes but the result is getting as "0"