Python File Organizer Project - Solutions and Explanations
File Organizer:
Create a program that organizes files in a directory based on their types.
Input values:
User specifies the directory path to be organized.
Output value:
Files in the specified directory "temp" into subdirectories based on their types (e.g., images, pdfs, videos).
Example:
Input values: Input directory path: /path/to/temp Output value: Files in /path/to/temp organized: - images/ - image1.jpg - image2.png - documents/ - document1.pdf - videos/ - video1.mp4
Here are two different solutions for a "File Organizer" program in Python. This program will organize files in a specified directory into subdirectories based on their file types (e.g., images, documents.
Solution 1: Basic Approach Using 'os' and 'shutil' Modules
Code:
# Solution 1: Basic Approach Using `os` and `shutil` Modules
import os # Provides functions for interacting with the operating system
import shutil # Provides functions for file operations like copying and moving
# Define file type categories and their corresponding extensions
FILE_TYPES = {
'images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
'documents': ['.pdf', '.doc', '.docx', '.txt'],
'videos': ['.mp4', '.mov', '.avi', '.mkv'],
'audio': ['.mp3', '.wav', '.flac'],
'archives': ['.zip', '.rar', '.7z', '.tar', '.gz']
}
def organize_files(directory_path):
"""Organize files in the given directory based on their types."""
# Iterate over each file in the specified directory
for filename in os.listdir(directory_path):
# Get the file extension
file_extension = os.path.splitext(filename)[1].lower()
# Determine the category for the file based on its extension
category = None
for key, extensions in FILE_TYPES.items():
if file_extension in extensions:
category = key
break
# If the file matches a known category, move it to the corresponding subdirectory
if category:
category_path = os.path.join(directory_path, category)
# Create the subdirectory if it doesn't exist
os.makedirs(category_path, exist_ok=True)
# Move the file to the subdirectory
source = os.path.join(directory_path, filename)
destination = os.path.join(category_path, filename)
shutil.move(source, destination)
print(f"Moved '{filename}' to '{category}/'")
else:
print(f"File '{filename}' does not match any known category.")
# Get the directory path from the user
directory_path = input("Enter the directory path to organize: ")
# Organize the files in the specified directory
organize_files(directory_path)
Output:
Enter the directory path to organize: i:/temp Moved '23121500486326SBIN_ChallanReceipt-advance-tax-rg-24-25.pdf' to 'documents/' Moved 'copy (online-video-cutter.com).mp4' to 'videos/' Moved 'copy1 (online-video-cutter.com).mp4' to 'videos/' File 'ErrorReport.csv' does not match any known category. Moved 'Happy-Birthday-with-Voicemod-Text-to-Song.mp3' to 'audio/' Moved 'PascalTriangleAnimated2.gif' to 'images/' File 'PortfolioImportTemplate.xlsx' does not match any known category. Moved 'python-tutorial-3.9.pdf' to 'documents/' Moved 'WhatsApp Image 2024-02-03 at 7.51.06 PM.jpeg' to 'images/'
Explanation:
- Uses the 'os' and 'shutil' modules to interact with the file system and move files.
- Defines a dictionary 'FILE_TYPES' to map file categories to their respective extensions.
- The 'organize_files()' function iterates over the files in the specified directory, determines the file type based on its extension, and moves it to the corresponding subdirectory.
- Creates the subdirectory if it doesn't already exist using 'os.makedirs()'.
- This solution is straightforward and works well for simple use cases but lacks structure for extensibility.
Solution 2: Using a Class-Based Approach for Organization and Extensibility
Code:
# Solution 2: Using a Class-Based Approach for Organization and Extensibility
import os # Provides functions for interacting with the operating system
import shutil # Provides functions for file operations like copying and moving
class FileOrganizer:
"""Class to handle file organization based on file types."""
# Define file type categories and their corresponding extensions
FILE_TYPES = {
'images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
'documents': ['.pdf', '.doc', '.docx', '.txt'],
'videos': ['.mp4', '.mov', '.avi', '.mkv'],
'audio': ['.mp3', '.wav', '.flac'],
'archives': ['.zip', '.rar', '.7z', '.tar', '.gz']
}
def __init__(self, directory_path):
"""Initialize the organizer with the specified directory path."""
self.directory_path = directory_path
def organize_files(self):
"""Organize files in the given directory based on their types."""
# Iterate over each file in the specified directory
for filename in os.listdir(self.directory_path):
# Get the file extension
file_extension = os.path.splitext(filename)[1].lower()
# Determine the category for the file based on its extension
category = self.get_category(file_extension)
# If the file matches a known category, move it to the corresponding subdirectory
if category:
self.move_file(filename, category)
else:
print(f"File '{filename}' does not match any known category.")
def get_category(self, file_extension):
"""Get the category for a file based on its extension."""
for key, extensions in self.FILE_TYPES.items():
if file_extension in extensions:
return key
return None
def move_file(self, filename, category):
"""Move a file to the specified category directory."""
category_path = os.path.join(self.directory_path, category)
# Create the subdirectory if it doesn't exist
os.makedirs(category_path, exist_ok=True)
# Move the file to the subdirectory
source = os.path.join(self.directory_path, filename)
destination = os.path.join(category_path, filename)
shutil.move(source, destination)
print(f"Moved '{filename}' to '{category}/'")
# Get the directory path from the user
directory_path = input("Enter the directory path to organize: ")
# Create an instance of the FileOrganizer class
organizer = FileOrganizer(directory_path)
# Organize the files in the specified directory
organizer.organize_files()
Output:
Enter the directory path to organize: i:\temp Moved '23121500486326SBIN_ChallanReceipt-advance-tax-rg-24-25.pdf' to 'documents/' Moved 'copy (online-video-cutter.com).mp4' to 'videos/' Moved 'copy1 (online-video-cutter.com).mp4' to 'videos/' File 'ErrorReport.csv' does not match any known category. Moved 'Happy-Birthday-with-Voicemod-Text-to-Song.mp3' to 'audio/' Moved 'PascalTriangleAnimated2.gif' to 'images/' File 'PortfolioImportTemplate.xlsx' does not match any known category. Moved 'python-tutorial-3.9.pdf' to 'documents/' Moved 'WhatsApp Image 2024-02-03 at 7.51.06 PM.jpeg' to 'images/'
Explanation:
- Encapsulates the file organization logic within a 'FileOrganizer' class, making the code more modular and easier to maintain.
- The '__init__()' method initializes the class with the directory path provided by the user.
- The 'organize_files()' method handles the main logic of organizing files into subdirectories based on their types.
- The 'get_category()' method determines the category of a file based on its extension.
- The 'move_file()' method moves files to their respective subdirectories, creating the subdirectory if it doesn't exist.
- This approach follows Object-Oriented Programming (OOP) principles, making it easier to extend and add new features (like handling additional file types).
Note:
Both solutions effectively organize files in a specified directory based on their types, with Solution 1 providing a basic function-based approach and Solution 2 offering a more organized, class-based design for better modularity and extensibility.
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics