نسخ ونقل الملفات في بايثون: العمل مع مكتبتي shutil و os
غالبًا ما يتطلب التطوير بلغة بايثون إجراء عمليات على الملفات والمجلدات. إنشاء النسخ الاحتياطية، معالجة تحميلات المستخدمين، تنظيم هيكل المشاريع، ونشر التطبيقات — كل هذه المهام تحتاج إلى إدارة برمجية لنظام الملفات. أتمتة هذه العمليات تبسط إدارة البيانات بشكل كبير وتلغي الحاجة إلى تنفيذ مهام متكررة يدويًا.
توفر مكتبة shutil في بايثون أدوات عالية المستوى للتعامل مع الملفات والمجلدات. وبالاقتران مع مكتبة os، تشكل مجموعة قوية من الأدوات متعددة المنصات لبناء سيناريوهات مرنة لإدارة نظام الملفات. كلا المكتبتين جزء من المكتبة القياسية لبايثون ومتاحتان دون تثبيت إضافي.
نظرة عامة على مكتبة shutil
اشتق اسم مكتبة shutil من "shell utility" وهي تمثل مجموعة من الدوال للعمليات عالية المستوى على الملفات والمجلدات. تشمل الوظائف الرئيسية للمكتبة:
copy()— نسخ ملف بدون حفظ البيانات الوصفيةcopy2()— نسخ ملف مع الحفظ الكامل للبيانات الوصفيةcopytree()— نسخ متكرر للمجلدات بأكملهاmove()— نقل الملفات والمجلدات إلى موقع جديدrmtree()— حذف متكرر للمجلدات مع محتوياتهاcopyfileobj()— نسخ بايت ببايت لكائنات الملفات
تتكامل مكتبة shutil بشكل فعال مع مكتبة os وهي مناسبة لكل من نصوص الأتمتة الصغيرة والتطبيقات الكبيرة على مستوى المؤسسات.
طرق نسخ الملفات
النسخ الأساسي باستخدام shutil.copy()
تقوم الدالة shutil.copy() بنسخ بسيط لمحتوى الملف دون نقل البيانات الوصفية:
import shutil
source = 'source_folder/example.txt'
destination = 'destination_folder/example.txt'
shutil.copy(source, destination)
هذه الدالة تنسخ محتوى الملف فقط. لا يتم حفظ البيانات الوصفية للملف بما في ذلك تاريخ الإنشاء ووقت آخر تعديل وصلاحيات الوصول. تشبه الدالة الأمر cp في أنظمة Unix/Linux دون استخدام علامات حفظ السمات.
من المهم تذكر أنه إذا كان المجلد الهدف غير موجود، سيحدث خطأ. يُوصى بالتحقق مسبقًا من وجود المجلد الوجهة أو إنشائه برمجيًا.
النسخ مع حفظ البيانات الوصفية: shutil.copy2()
عند الحاجة إلى حفظ جميع معلومات الملف بما في ذلك الطوابع الزمنية والمالك وصلاحيات الوصول، يجب استخدام الدالة copy2():
shutil.copy2('file.txt', 'backup/file.txt')
هذه الطريقة مفيدة بشكل خاص عند إنشاء النسخ الاحتياطية، أو ترحيل المشاريع بين أنظمة مختلفة، أو عندما يكون الحفاظ على السمات الأصلية للملفات أمرًا بالغ الأهمية. تضمن الدالة copy2() إعادة إنتاج دقيقة قدر الإمكان للملف الأصلي في الموقع الجديد.
نسخ المجلدات
النسخ المتكرر باستخدام shutil.copytree()
لنسخ مجلدات كاملة مع جميع المجلدات الفرعية والملفات المضمنة، تُستخدم الدالة copytree():
shutil.copytree('old_project', 'new_project')
افتراضيًا، تُصدر الدالة copytree() خطأ FileExistsError إذا كان المجلد الهدف موجودًا بالفعل. بدءًا من بايثون 3.8، يمكن استخدام المعامل dirs_exist_ok=True للسماح بالكتابة فوق المحتوى أو إضافته:
shutil.copytree('old_project', 'new_project', dirs_exist_ok=True)
تعمل الدالة بشكل متكرر وتُستخدم في السيناريوهات التالية:
- استنساخ قوالب المشاريع