ترتيب الملفات تلقائياً ببايثون: سكريبت ينظم ملفاتك في ثوانٍ
إذا كان مجلد التنزيلات عندك يشبه مكباً رقمياً بمئات الملفات غير المصنفة، فأنت لست وحدك. معظم الناس يضيعون ساعات أسبوعياً في ترتيب المستندات والصور والفيديوهات يدوياً. لكن ماذا لو تستطيع أتمتة ترتيب الملفات بالكامل بسكريبت بايثون واحد؟
في هذا الدرس ستتعلم بناء مُنظم ملفات ببايثون يصنف الملفات تلقائياً في مجلدات حسب نوعها. هذا من أكثر مشاريع أتمتة بايثون عملية، ويعمل على ويندوز وماك ولينكس.
لماذا تؤتمت ترتيب الملفات؟
ترتيب الملفات يدوياً يبدو بسيطاً لكنه يتراكم بشكل كبير. إذا قضيت 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 watchdogimport 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 توفر مراقبة فورية تبقي مجلداتك نظيفة تلقائياً.
لمواصلة رحلة تعلم أتمتة بايثون، اطلع على أدلتنا الأخرى: الدليل الشامل لأتمتة بايثون وسحب البيانات من المواقع وأتمتة الإيميلات.
تعليقات
إرسال تعليق