Awesome-Python-Scripts/FileMagic_Organizer/main.py
2023-10-13 16:05:06 +05:30

105 lines
4.6 KiB
Python

import os
import shutil
import datetime
def categorize_by_size(file_size):
# Define size categories and their ranges in bytes
size_categories = {
'small': (0, 1024), # Up to 1 KB
'medium': (1025, 1024 * 1024), # 1 KB to 1 MB
'large': (1024 * 1025, float('inf')) # Larger than 1 MB
}
for category, (min_size, max_size) in size_categories.items():
if min_size <= file_size < max_size:
return category
return 'unknown'
def organize_files(source_dir, destination_dir, organize_by_type=True, organize_by_date=True, organize_by_size=True):
# Create a dictionary to map file extensions to corresponding folders
file_types = {
'images': ['.png', '.jpg', '.jpeg', '.gif'],
'documents': ['.pdf', '.docx', '.txt'],
'videos': ['.mp4', '.avi', '.mkv'],
'other': [] # Add more categories and file extensions as needed
}
# Create destination subdirectories if they don't exist
if organize_by_type:
for folder in file_types:
folder_path = os.path.join(destination_dir, folder)
os.makedirs(folder_path, exist_ok=True)
if organize_by_date:
for year in range(2010, 2030): # Adjust the range based on your needs
year_folder = os.path.join(destination_dir, str(year))
os.makedirs(year_folder, exist_ok=True)
for month in range(1, 13):
month_folder = os.path.join(year_folder, f"{month:02d}")
os.makedirs(month_folder, exist_ok=True)
if organize_by_size:
for size_category in ['small', 'medium', 'large']:
size_folder = os.path.join(destination_dir, size_category)
os.makedirs(size_folder, exist_ok=True)
# Scan the source directory and organize files
for filename in os.listdir(source_dir):
file_path = os.path.join(source_dir, filename)
if os.path.isfile(file_path):
# Determine the file type based on extension
file_type = None
for category, extensions in file_types.items():
if any(filename.lower().endswith(ext) for ext in extensions):
file_type = category
break
if organize_by_type and file_type:
# Move the file to the corresponding subdirectory
destination_folder = os.path.join(destination_dir, file_type)
destination_path = os.path.join(destination_folder, filename)
shutil.move(file_path, destination_path)
print(f"Moved: {filename} to {file_type} folder")
if organize_by_date:
# Get the creation date of the file
creation_time = os.path.getctime(file_path)
creation_date = datetime.datetime.fromtimestamp(creation_time)
# Determine the destination folder based on creation date
destination_folder = os.path.join(
destination_dir,
str(creation_date.year),
f"{creation_date.month:02d}",
)
# Move the file to the corresponding subdirectory
destination_path = os.path.join(destination_folder, filename)
shutil.move(file_path, destination_path)
print(f"Moved: {filename} to {creation_date.year}/{creation_date.month:02d} folder")
if organize_by_size:
# Get the size of the file in bytes
file_size = os.path.getsize(file_path)
# Determine the destination folder based on file size
size_category = categorize_by_size(file_size)
destination_folder = os.path.join(destination_dir, size_category)
destination_path = os.path.join(destination_folder, filename)
shutil.move(file_path, destination_path)
print(f"Moved: {filename} to {size_category} folder")
# Get source and destination directories from the user
source_directory = input("Enter the source directory path: ")
destination_directory = input("Enter the destination directory path: ")
# Ask the user how they want to organize the files
organize_by_type = input("Organize by file type? (yes/no): ").lower() == 'yes'
organize_by_date = input("Organize by creation date? (yes/no): ").lower() == 'yes'
organize_by_size = input("Organize by size? (yes/no): ").lower() == 'yes'
organize_files(source_directory, destination_directory, organize_by_type, organize_by_date, organize_by_size)