Last modified: Jan 10, 2023 By Alexander Williams
Sort Folders by Size in Python
In this tutorial, we're going to learn how to sort folders by size.
First of all, let's see the folders that we'll be sorting.
/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder:
As you can see, the RootFolder folder contains "10" sub-folders of different sizes.
Now, let's get started.
Sort folders by size
First, we need to write a function that returns the size of a given folder.
Code:
import os
def dir_size(path):
#initialize the size
total_size = 0
#use the walk() method to navigate through directory tree
for dirpath, dirnames, filenames in os.walk(path):
for i in filenames:
#use join to concatenate all the components of path
f = os.path.join(dirpath, i)
#use getsize to generate size in bytes and add it to the total size
total_size += os.path.getsize(f)
return total_size
Let's test our function.
print(dir_size("/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub5"))
Output:
2813
Now, to sort folders by size, we need to follow these steps:
- Getting all files in the RootFolder folder using the os.listdir() method.
- Checking each file if is a folder using the isdir() method.
- Append folder's name, folder's path folder's size to a list.
- Sorting the list by size using the sort() method.
# base folder
base_dir = "/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder"
# Get all sub files
files = os.listdir(base_dir)
folders = []
for e in files:
#join base folder's name with sub file
filepath = os.path.join(base_dir, e)
#check if the file is directory(folder)
if os.path.isdir(filepath):
#append the folder_name, folder_path & size to the folders list
folders.append({"name":e, "path":filepath, "size":dir_size(filepath)})
#sort sub_folders by size
# reverse = True: returns largest to smallest
# reverse = False: returns smallest to largest
folders.sort(key=lambda filename: filename['size'], reverse=True)
Notice:
reverse = True: returns largest to smallest
reverse = False: returns smallest to largest
Now, let's show the result after sorting.
for f in folders:
print("#"*50)
#print folder's name
print("folder name: " + f['name'])
#print folder's path
print("folder path: " + f['path'])
#print folder's size
print("folder size: " + str(f['size']))
Output:
##################################################
file name: sub3
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub3
file size: 3404128
##################################################
file name: sub10
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub10
file size: 1761395
##################################################
file name: sub4
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub4
file size: 512059
##################################################
file name: sub8
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub8
file size: 106092
##################################################
file name: sub6
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub6
file size: 48131
##################################################
file name: sub2
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub2
file size: 10434
##################################################
file name: sub9
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub9
file size: 6730
##################################################
file name: sub5
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub5
file size: 2813
##################################################
file name: sub1
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub1
file size: 549
##################################################
file name: sub7
file filepath: /home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub7
file size: 0
Write the sort_by_size method
After explaining how to sort folders by size, now let's re-write a method that you can use in your app:
class SortFolders():
def __init__(self, dir_path, reverse=True):
self.dir_path = dir_path
self.reverse = reverse
def dir_size(self, path):
total_size = 0
for dirpath, dirnames, filenames in os.walk(path):
for i in filenames:
f = os.path.join(dirpath, i)
total_size += os.path.getsize(f)
return total_size
@property
def sort_by_size(self):
files = os.listdir(self.dir_path)
folders = []
for e in files:
filepath = os.path.join(self.dir_path, e)
if os.path.isdir(filepath):
folders.append({"filename":e, "filepath":filepath, "size":self.dir_size(filepath)})
folders.sort(key=lambda filename: filename['size'], reverse=self.reverse)
return folders
How to use it?
SortFolders(dir_path="base dir", reverse=False).sort_by_size
- dir_path: required
- reverse: optional (reverse=True by default)
Example
print(SortFolders(dir_path="/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder", reverse=False).sort_by_size)
Output
[{'filename': 'sub7', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub7', 'size': 0}, {'filename': 'sub1', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub1', 'size': 549}, {'filename': 'sub5', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub5', 'size': 2813}, {'filename': 'sub9', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub9', 'size': 6730}, {'filename': 'sub2', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub2', 'size': 10434}, {'filename': 'sub6', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub6', 'size': 48131}, {'filename': 'sub8', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub8', 'size': 106092}, {'filename': 'sub4', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub4', 'size': 512059}, {'filename': 'sub10', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub10', 'size': 1761395}, {'filename': 'sub3', 'filepath': '/home/pytutorial/Desktop/pytutorial/tutorials/RootFolder/sub3', 'size': 3404128}]