import os
import math


def getFileSize(path, kilo=1024, readable=False, shortRead=False):
    size = 0
    sizeArr = []
    units = ["B", "KB", "MB", "GB", "TB", "PB", "EB"]
    if os.path.isdir(path):
        for dirpath, dirnames, filenames in os.walk(path):
            for i in filenames:
                size += os.path.getsize(os.path.join(dirpath, i))
    elif os.path.isfile(path):
        size += os.path.getsize(path)
    unit = math.floor(math.log(size, kilo))
    for k in range(0, unit + 1):
        sizeArr.append(
            math.floor((size % kilo ** (k + 1)) / kilo ** k)
        )

    if readable:
        sizeString = ""
        if not shortRead:
            for x in range(unit, -1, -1):
                sizeString += str(sizeArr[x]) + units[x] + " "
            return sizeString[:-1]
        else:
            return (
                str(sizeArr[-1])
                + "."
                + str(math.floor(sizeArr[-2] / 1.024))
                + units[len(sizeArr) - 1]
            )
    else:
        return sizeArr

Examples

Reference

Example Directory Type Size
C:\Users\anacl\
OneDrive\Documents
Folder 3.13GB (3,366,343,239 Bytes)
C:\Users\anacl\
OneDrive\Pictures
Folder 83.4MB (87,468,781 Bytes)
C:\Users\anacl\
OneDrive\Pictures\screenshot.png
File 139KB (143,262 Bytes)

Default

print(getFileSize("C:\\Users\\anacl\\OneDrive\\Documents"))
print(getFileSize("C:\\Users\\anacl\\OneDrive\\Pictures"))
print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Pictures\\screenshot.png"
    )
)

# Expected Output
# [583, 404, 138, 3]
# [749, 426, 83]
# [926, 139]

Each element in the returned list is the value of [B, KB, MB, GB, ...] of the file size.

Full Readable Output

print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Documents", readable=True
    )
)
print(
    getFileSize("C:\\Users\\anacl\\OneDrive\\Pictures", readable=True)
)
print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Pictures\\screenshot.png",
        readable=True,
    )
)
# Expected Output
# 3GB 138MB 404KB 583B
# 83MB 426KB 749B
# 139KB 926B

Short Readable Output

print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Documents",
        readable=True,
        shortRead=True,
    )
)
print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Pictures",
        readable=True,
        shortRead=True,
    )
)
print(
    getFileSize(
        "C:\\Users\\anacl\\OneDrive\\Pictures\\screenshot.png",
        readable=True,
        shortRead=True,
    )
)
# Expected Output
# 3.134GB
# 83.416MB
# 139.904KB
You’ve successfully subscribed to Sunghyun Cho
Welcome back! You’ve successfully signed in.
Great! You’ve successfully signed up.
Your link has expired
Success! Check your email for magic link to sign-in.