Skip to content

Commit 8243a36

Browse files
authored
Merge pull request sumanth-0#798 from akashadsare/add-folder-size-calculator
Add Folder Size Calculator - Issue sumanth-0#786
2 parents 242ccd8 + 30aaee7 commit 8243a36

2 files changed

Lines changed: 179 additions & 0 deletions

File tree

Folder_Size_Calculator/README.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Folder Size Calculator
2+
3+
A minimal Python script that calculates and displays the size of each folder in a directory in human-readable format.
4+
5+
## Features
6+
7+
- **Recursive Size Calculation**: Calculates total size including all subdirectories
8+
- **Human-Readable Format**: Displays sizes in B, KB, MB, GB, TB, PB
9+
- **Sorted Results**: Shows folders sorted by size (largest first)
10+
- **Total Summary**: Displays total size of all folders
11+
- **Error Handling**: Gracefully handles permission errors and missing files
12+
13+
## Usage
14+
15+
### Command Line
16+
```bash
17+
python folder_size_calculator.py [directory]
18+
```
19+
20+
### Interactive Mode
21+
```bash
22+
python folder_size_calculator.py
23+
```
24+
25+
## Example Output
26+
27+
```
28+
Folder Size Calculator
29+
=========================
30+
31+
Calculating folder sizes in: /home/user/projects
32+
33+
Folder sizes in: /home/user/projects
34+
--------------------------------------------------
35+
Folder Name Size
36+
--------------------------------------------------
37+
large_project 1.2 GB
38+
media_files 856.3 MB
39+
documents 45.7 MB
40+
scripts 2.1 MB
41+
configs 156.8 KB
42+
--------------------------------------------------
43+
Total 2.1 GB
44+
```
45+
46+
## Size Units
47+
48+
| Unit | Description |
49+
|------|-------------|
50+
| B | Bytes |
51+
| KB | Kilobytes (1,024 B) |
52+
| MB | Megabytes (1,024 KB) |
53+
| GB | Gigabytes (1,024 MB) |
54+
| TB | Terabytes (1,024 GB) |
55+
| PB | Petabytes (1,024 TB) |
56+
57+
## Use Cases
58+
59+
- **Disk Space Analysis**: Identify which folders consume most space
60+
- **Cleanup Planning**: Find large directories for cleanup
61+
- **Storage Management**: Monitor folder growth over time
62+
- **System Administration**: Quick directory size overview
63+
64+
## Requirements
65+
66+
- Python 3.6+
67+
- No external dependencies
68+
69+
## Error Handling
70+
71+
- Permission denied folders are skipped silently
72+
- Missing or inaccessible files don't break the calculation
73+
- Invalid directories show appropriate error messages
74+
75+
## Performance
76+
77+
- Efficiently walks directory trees
78+
- Handles large directories with many files
79+
- Minimal memory usage during calculation
80+
81+
## Author
82+
83+
Created for issue #786 - 100 Lines of Python Code Project
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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"\nFolder 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"\nCalculating 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

Comments
 (0)