-
Notifications
You must be signed in to change notification settings - Fork 0
/
searchFoldersAnalyzer.py
117 lines (96 loc) · 4 KB
/
searchFoldersAnalyzer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
# import pandas as pd
from openpyxl import Workbook
from datetime import datetime
import sys
def get_folder_size(folder_path):
total_size = 0
for path, _, files in os.walk(folder_path):
for f in files:
fp = os.path.join(path, f)
try:
total_size += os.path.getsize(fp)
except Exception as e:
create_error_log(f"Error getting file size: {str(e)}")
continue # Log the error and continue scanning
return total_size
def convert_size(size_in_bytes):
# Convert size to KB, MB, or GB
if size_in_bytes < 1024:
return size_in_bytes, 'Bytes'
elif size_in_bytes < 1024 * 1024:
return round(size_in_bytes / 1024, 2), 'KB'
elif size_in_bytes < 1024 * 1024 * 1024:
return round(size_in_bytes / (1024 * 1024), 2), 'MB'
else:
return round(size_in_bytes / (1024 * 1024 * 1024), 2), 'GB'
def scan_folders(folder_path):
# Create a list of all folders
all_folders = [x[0] for x in os.walk(folder_path)]
total_folders = len(all_folders)
folder_sizes = []
for i, folder in enumerate(all_folders):
# Skip folders...
folder_names = folder.split(os.sep)
if any(skip_folder in folder_names for skip_folder in folders_to_skip):
continue
try:
folder_size = get_folder_size(folder)
size, unit = convert_size(folder_size)
folder_sizes.append((folder, float(size), unit)) # Convert size to float
# Calculate progress
progress_percent = ((i + 1) / total_folders) * 100
print(f"Scanning folder {folder}... ({progress_percent:.2f}% complete)")
except Exception as e:
create_error_log(f"Error scanning folder: {str(e)}")
continue # Log the error and continue scanning
# Define the order of units
unit_order = {'GB': 1, 'MB': 2, 'KB': 3, 'Bytes': 4}
# Sort by unit first, then by size
folder_sizes.sort(key=lambda x: (unit_order[x[2]], -x[1])) # Sort sizes in descending order
return folder_sizes
# def create_excel(folder_sizes):
# df = pd.DataFrame(folder_sizes, columns=['Folder Path', 'Size', 'Unit'])
# now = datetime.now()
# date_time = now.strftime("%m-%d-%H-%M")
# excel_path = os.path.join(folder_path, f'outp{date_time}.xlsx')
# df.to_excel(excel_path, index=False)
def create_excel_xl(folder_sizes):
wb = Workbook()
ws = wb.active
ws.append(['Folder Path', 'Size', 'Unit'])
for folder_size in folder_sizes:
try:
ws.append(folder_size)
except Exception as e:
create_error_log(f"Error appending folder size: {str(e)}")
now = datetime.now()
date_time = now.strftime("%m-%d-%H-%M")
excel_path = os.path.join(os.getcwd(), f'outp{date_time}.xlsx')
wb.save(excel_path)
def create_error_log(error_name):
now = datetime.now()
date_time = now.strftime("%m-%d-%H")
date_time2 = now.strftime("%m-%d-%H-%M-%S")
log_path = os.path.join(os.getcwd(), f'error_log_{date_time}.txt') # Use os.getcwd() to get the current working directory
with open(log_path, 'a') as f:
f.write(f"{date_time2}: {error_name}\n")
# MAIN
# Get folder path from command line arguments or user input
folder_path = sys.argv[1] if len(sys.argv) > 1 else input("Enter the folder path: ")
# Collect all command line arguments after the first one into a list
if len(sys.argv) > 2:
folders_to_skip = sys.argv[2:]
else:
user_input = input("Enter the folders to skip separated by commas, or press Enter to skip none: ")
folders_to_skip = [folder.strip() for folder in user_input.split(",")] if user_input else []
print("Scanning folders...")
try:
folder_sizes = scan_folders(folder_path)
print("Creating Excel file...")
create_excel_xl(folder_sizes)
print("Excel file created successfully.")
except Exception as e:
create_error_log(str(e))
print("An error occurred. Please check the error log.")
input("Press Enter to exit...")