ترتيب الملفات تلقائياً ببايثون: سكريبت ينظم ملفاتك في ثوانٍ

إذا كان مجلد التنزيلات عندك يشبه مكباً رقمياً بمئات الملفات غير المصنفة، فأنت لست وحدك. معظم الناس يضيعون ساعات أسبوعياً في ترتيب المستندات والصور والفيديوهات يدوياً. لكن ماذا لو تستطيع أتمتة ترتيب الملفات بالكامل بسكريبت بايثون واحد؟

في هذا الدرس ستتعلم بناء مُنظم ملفات ببايثون يصنف الملفات تلقائياً في مجلدات حسب نوعها. هذا من أكثر مشاريع أتمتة بايثون عملية، ويعمل على ويندوز وماك ولينكس.

لماذا تؤتمت ترتيب الملفات؟

ترتيب الملفات يدوياً يبدو بسيطاً لكنه يتراكم بشكل كبير. إذا قضيت 5 دقائق يومياً في تصنيف الملفات، هذا يعني أكثر من 30 ساعة سنوياً مهدرة على مهمة يمكن لسكريبت بايثون إنجازها في ثوانٍ.

الأتمتة تقضي على الخطأ البشري. لن تضع ملف PDF في مجلد الصور بالخطأ أبداً. هذا المشروع يعلمك أيضاً مفاهيم بايثون أساسية تنقلك مباشرة لمشاريع مثل سحب البيانات من المواقع وأتمتة الإيميلات.

فهم مكتبتي os و shutil في بايثون

مكتبة os توفر دوال للتعامل مع نظام التشغيل: استعراض محتويات المجلدات، فحص المسارات، إنشاء المجلدات. مكتبة shutil تبني عليها بعمليات متقدمة مثل النسخ والنقل والضغط.

import os
import shutil

# استعراض الملفات في مجلد
files = os.listdir("/path/to/folder")

# فحص هل المسار ملف وليس مجلد
os.path.isfile("/path/to/file.txt")

# استخراج امتداد الملف
name, ext = os.path.splitext("document.pdf")
# name = "document", ext = ".pdf"

# إنشاء مجلد جديد
os.makedirs("/path/to/new/folder", exist_ok=True)

# نقل ملف لموقع جديد
shutil.move("/source/file.txt", "/destination/file.txt")

بناء مُنظم الملفات الأساسي

لنبنِ السكريبت الكامل. هذا الإصدار يصنف الملفات حسب الامتداد ويتعامل مع الملفات المكررة بذكاء:

import os
import shutil

class FileOrganizer:
    def __init__(self, directory):
        self.directory = directory
        self.categories = {
            "صور": [".jpg", ".jpeg", ".png", ".gif", ".svg", ".webp"],
            "مستندات": [".pdf", ".docx", ".doc", ".txt", ".xlsx", ".pptx", ".csv"],
            "فيديوهات": [".mp4", ".avi", ".mkv", ".mov", ".wmv"],
            "صوتيات": [".mp3", ".wav", ".flac", ".aac", ".ogg"],
            "ملفات_مضغوطة": [".zip", ".rar", ".tar", ".gz", ".7z"],
            "أكواد": [".py", ".js", ".html", ".css", ".json", ".xml"]
        }
        self.moved_count = 0

    def get_category(self, extension):
        for category, extensions in self.categories.items():
            if extension.lower() in extensions:
                return category
        return "أخرى"

    def handle_duplicate(self, destination):
        if not os.path.exists(destination):
            return destination
        base, ext = os.path.splitext(destination)
        counter = 1
        while os.path.exists(f"{base}_{counter}{ext}"):
            counter += 1
        return f"{base}_{counter}{ext}"

    def organize(self):
        print(f"جاري ترتيب الملفات في: {self.directory}")
        for filename in os.listdir(self.directory):
            filepath = os.path.join(self.directory, filename)
            if os.path.isdir(filepath):
                continue
            _, extension = os.path.splitext(filename)
            if not extension:
                continue
            category = self.get_category(extension)
            category_path = os.path.join(self.directory, category)
            os.makedirs(category_path, exist_ok=True)
            destination = os.path.join(category_path, filename)
            destination = self.handle_duplicate(destination)
            try:
                shutil.move(filepath, destination)
                self.moved_count += 1
                print(f"  تم نقل: {filename} -> {category}/")
            except Exception as e:
                print(f"  خطأ في نقل {filename}: {e}")
        print(f"تم! نُقلت {self.moved_count} ملفات.")

if __name__ == "__main__":
    downloads = os.path.expanduser("~/Downloads")
    organizer = FileOrganizer(downloads)
    organizer.organize()

إضافة مراقبة فورية بمكتبة Watchdog

السكريبت الأساسي يعمل عند تشغيله يدوياً. لكن ماذا لو تُرتب الملفات تلقائياً لحظة وصولها لمجلد التنزيلات؟ مكتبة watchdog تحقق ذلك:

pip install watchdog
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class AutoOrganizeHandler(FileSystemEventHandler):
    def __init__(self, organizer):
        self.organizer = organizer
    
    def on_created(self, event):
        if event.is_directory:
            return
        time.sleep(1)  # انتظر اكتمال التحميل
        filepath = event.src_path
        filename = os.path.basename(filepath)
        _, extension = os.path.splitext(filename)
        if not extension:
            return
        category = self.organizer.get_category(extension)
        category_path = os.path.join(self.organizer.directory, category)
        os.makedirs(category_path, exist_ok=True)
        destination = os.path.join(category_path, filename)
        destination = self.organizer.handle_duplicate(destination)
        try:
            shutil.move(filepath, destination)
            print(f"تم الترتيب تلقائياً: {filename} -> {category}/")
        except Exception as e:
            print(f"خطأ: {e}")

def start_watching(directory):
    organizer = FileOrganizer(directory)
    handler = AutoOrganizeHandler(organizer)
    observer = Observer()
    observer.schedule(handler, directory, recursive=False)
    observer.start()
    print(f"مراقبة {directory} للملفات الجديدة...")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

تشغيله بجدول زمني

يمكنك دمج هذا المنظم مع جدولة المهام لتشغيله يومياً. اطلع على دليلنا الكامل حول جدولة سكريبتات بايثون مع cron وschedule.

حل المشاكل الشائعة

خطأ Permission Denied: بعض الملفات قد تكون مفتوحة ببرنامج آخر. أغلق البرنامج أو أضف آلية إعادة المحاولة.

الملفات المخفية: على ماك ولينكس، الملفات التي تبدأ بنقطة (مثل .DS_Store) مخفية. أضف فحص: if filename.startswith("."): continue

تحميلات غير مكتملة: المتصفحات تنشئ ملفات مؤقتة أثناء التحميل. أضف .crdownload و.part و.tmp لقائمة التجاهل.

الخلاصة

أتمتة ترتيب الملفات ببايثون مشروع عملي يوفر وقتاً حقيقياً ويعلمك مهارات برمجية قابلة للتطبيق. الإصدار الأساسي يرتب الملفات دفعة واحدة، ومكتبة watchdog توفر مراقبة فورية تبقي مجلداتك نظيفة تلقائياً.

لمواصلة رحلة تعلم أتمتة بايثون، اطلع على أدلتنا الأخرى: الدليل الشامل لأتمتة بايثون وسحب البيانات من المواقع وأتمتة الإيميلات.

تعليقات

المشاركات الشائعة من هذه المدونة

تعلم Git و GitHub للمبتدئين: دليل شامل بالعربي خطوة بخطوة (2026)

تعلم بايثون من الصفر 2026: دليل شامل للمبتدئين

دليل الصحة النفسية 2026: كيف تتعامل مع القلق والاكتئاب وتعيش حياة متوازنة