1+ #!/usr/bin/env python3
2+ import os
3+ import sys
4+
5+
6+ def get_size (path ):
7+ """Get total size of directory in bytes."""
8+ total = 0
9+ try :
10+ for dirpath , dirnames , filenames in os .walk (path ):
11+ for filename in filenames :
12+ filepath = os .path .join (dirpath , filename )
13+ try :
14+ total += os .path .getsize (filepath )
15+ except (OSError , FileNotFoundError ):
16+ pass
17+ except (OSError , PermissionError ):
18+ pass
19+ return total
20+
21+
22+ def format_size (bytes_size ):
23+ """Convert bytes to human-readable format."""
24+ for unit in ['B' , 'KB' , 'MB' , 'GB' , 'TB' ]:
25+ if bytes_size < 1024.0 :
26+ return f"{ bytes_size :.1f} { unit } "
27+ bytes_size /= 1024.0
28+ return f"{ bytes_size :.1f} PB"
29+
30+
31+ def calculate_folder_sizes (directory ):
32+ """Calculate sizes of all folders in directory."""
33+ folder_sizes = []
34+
35+ try :
36+ items = os .listdir (directory )
37+ for item in items :
38+ item_path = os .path .join (directory , item )
39+ if os .path .isdir (item_path ):
40+ size = get_size (item_path )
41+ folder_sizes .append ((item , size ))
42+ except (OSError , PermissionError ) as e :
43+ print (f"Error accessing directory: { e } " )
44+ return []
45+
46+ return sorted (folder_sizes , key = lambda x : x [1 ], reverse = True )
47+
48+
49+ def display_results (folder_sizes , directory ):
50+ """Display folder sizes in formatted table."""
51+ if not folder_sizes :
52+ print ("No folders found or permission denied" )
53+ return
54+
55+ print (f"\n Folder sizes in: { directory } " )
56+ print ("-" * 50 )
57+ print (f"{ 'Folder Name' :<30} { 'Size' :<15} " )
58+ print ("-" * 50 )
59+
60+ total_size = 0
61+ for folder , size in folder_sizes :
62+ formatted_size = format_size (size )
63+ print (f"{ folder :<30} { formatted_size :<15} " )
64+ total_size += size
65+
66+ print ("-" * 50 )
67+ print (f"{ 'Total' :<30} { format_size (total_size ):<15} " )
68+
69+
70+ def main ():
71+ """Main function."""
72+ print ("Folder Size Calculator" )
73+ print ("=" * 25 )
74+
75+ if len (sys .argv ) > 1 :
76+ directory = sys .argv [1 ]
77+ else :
78+ directory = input ("Enter directory path (or . for current): " ).strip ()
79+ if not directory :
80+ directory = "."
81+
82+ if not os .path .exists (directory ):
83+ print (f"Directory not found: { directory } " )
84+ return
85+
86+ if not os .path .isdir (directory ):
87+ print (f"Not a directory: { directory } " )
88+ return
89+
90+ print (f"\n Calculating folder sizes in: { os .path .abspath (directory )} " )
91+ folder_sizes = calculate_folder_sizes (directory )
92+ display_results (folder_sizes , directory )
93+
94+
95+ if __name__ == "__main__" :
96+ main ()
0 commit comments