1. المقدمة
يُعد Python من أقوى الأدوات التي توفر وسائل سهلة وفعالة للتعامل مع الملفات. ومن بين هذه العمليات، يُعتبر نسخ الملفات مهمة شائعة في الاستخدام اليومي. في هذا المقال سنشرح كيفية استخدام مكتبة Python القياسية shutil
لنسخ الملفات والمجلدات بكفاءة. سنعرض أمثلة عملية للكود، مع تقنيات لتجنّب الكتابة فوق الملفات، وكيفية التعامل مع الأخطاء، بالإضافة إلى طرق متقدمة لنسخ الملفات.
2. التحضير لنسخ الملفات باستخدام Python
استيراد وحدة shutil
تُعتبر وحدة shutil
جزءًا من مكتبات Python القياسية، ولا تحتاج إلى أي تثبيت إضافي. يمكن استيرادها عبر الكود التالي:
import shutil
تتيح هذه الوحدة إمكانية النسخ، النقل، والحذف للملفات. وبالاقتران مع وحدة os
يمكن التحقق من وجود الملفات والمجلدات وتعزيز التعامل مع الأخطاء.
مزايا وحدة shutil
تتميز shutil
بسهولة الاستخدام وبنية الأكواد البسيطة. وهي أداة قوية عند الحاجة إلى تنفيذ عمليات جماعية مثل نسخ مجلدات كاملة.

3. الاستخدام الأساسي لوحدة shutil
استخدام shutil.copy()
shutil.copy()
هي الدالة الأساسية لنسخ الملفات، حيث تقوم بنسخ الملف الأصلي إلى موقع جديد.
import shutil
# نسخ ملف
shutil.copy('original.txt', 'copy.txt')
إذا وُجد ملف بنفس الاسم في الوجهة، سيتم استبداله.
استخدام shutil.copy2()
تقوم shutil.copy2()
بنسخ محتوى الملف بالإضافة إلى البيانات الوصفية (مثل تاريخ الإنشاء وصلاحيات الوصول).
import shutil
# نسخ المحتوى مع البيانات الوصفية
shutil.copy2('original.txt', 'copy_with_metadata.txt')
تُستخدم هذه الطريقة عند الحاجة إلى نسخة مطابقة تمامًا للملف.
4. نسخ مجلد كامل
استخدام shutil.copytree()
تُستخدم shutil.copytree()
لنسخ مجلد كامل بما يحتويه من ملفات ومجلدات فرعية.
import shutil
# نسخ مجلد كامل
shutil.copytree('source_directory', 'destination_directory')
إذا كان المجلد الهدف موجودًا مسبقًا، ستظهر رسالة خطأ. لذا يُفضل التحقق أولًا.
تجاهل ملفات أو مجلدات معينة أثناء النسخ
يمكن استبعاد ملفات أو مجلدات من النسخ باستخدام معامل ignore
مع shutil.ignore_patterns()
.
import shutil
# تجاهل ملفات .log أثناء النسخ
shutil.copytree('source_directory', 'destination_directory', ignore=shutil.ignore_patterns('*.log'))
في هذا المثال، لن يتم نسخ ملفات .log
.
5. تقنيات لتجنّب الكتابة فوق الملفات
استخدام os.path.exists()
بشكل افتراضي، تستبدل shutil.copy()
أو shutil.copy2()
الملفات الموجودة. لتفادي ذلك، يجب التحقق أولًا من وجود الملف.
import shutil
import os
# التحقق من وجود الملف قبل النسخ
if not os.path.exists('copy.txt'):
shutil.copy('original.txt', 'copy.txt')
else:
print('الملف موجود بالفعل. تم إلغاء النسخ.')
استخدام pathlib.Path.exists()
تُسهل مكتبة pathlib
التحقق من وجود الملفات بطريقة أكثر وضوحًا.
from pathlib import Path
# التحقق باستخدام Path
import shutil
dst = Path('copy.txt')
if not dst.exists():
shutil.copy('original.txt', dst)
else:
print('الملف موجود بالفعل. تم إلغاء النسخ.')
6. نقل الملفات باستخدام Python
استخدام shutil.move()
تُستخدم shutil.move()
لنقل الملفات أو المجلدات إلى مكان آخر.
import shutil
# نقل ملف
shutil.move('original.txt', 'new_folder/original.txt')
إذا لم يكن المجلد الهدف موجودًا، سيظهر خطأ FileNotFoundError
. لذلك يُفضل إنشاؤه مسبقًا.
import shutil
import os
# التحقق من وجود المجلد وإنشاؤه
if not os.path.exists('new_folder'):
os.makedirs('new_folder')
# نقل الملف
shutil.move('original.txt', 'new_folder/original.txt')

7. أمثلة عملية على نسخ الملفات
نسخ ملف
import shutil
# نسخ ملف
shutil.copy('data.txt', 'backup/data_backup.txt')
نسخ مجلد كامل
import shutil
# نسخ مجلد كامل
shutil.copytree('project_files', 'project_backup')
نسخ دون استبدال الملفات
import shutil
import os
# نسخ فقط إذا لم يكن الملف موجودًا
if not os.path.exists('backup/report.txt'):
shutil.copy('report.txt', 'backup/report.txt')
else:
print('الملف موجود مسبقًا. تم إلغاء النسخ.')
8. نسخ أنواع محددة من الملفات
يمكن استخدام مكتبة glob
لنسخ ملفات بأنواع محددة مثل .txt
أو .csv
.
import shutil
import glob
# نسخ جميع ملفات .txt
for file in glob.glob('data/*.txt'):
shutil.copy(file, 'backup/')
بهذا سيتم نسخ جميع ملفات .txt
من مجلد data
إلى مجلد backup
.
9. التعامل مع الأخطاء والاستثناءات
يُعتبر التعامل مع الأخطاء أمرًا أساسيًا عند العمل على الملفات، مثل عدم العثور على الملف أو مشاكل في الصلاحيات.
إضافة معالجة الاستثناءات
import shutil
try:
shutil.copy('non_existent_file.txt', 'backup/')
except FileNotFoundError as e:
print(f'الملف غير موجود: {e}')
except PermissionError as e:
print(f'خطأ في الصلاحيات: {e}')
except Exception as e:
print(f'حدث خطأ غير متوقع: {e}')
في هذا المثال يتم التعامل مع الأخطاء الشائعة بشكل منفصل لسهولة المتابعة.
10. الخلاصة
باستخدام وحدة shutil
في Python، يمكن نسخ الملفات والمجلدات بسهولة. ومن خلال تقنيات منع الاستبدال، نسخ أنواع معينة فقط، وإضافة معالجة للأخطاء، تصبح عملية إدارة الملفات أكثر أمانًا وفعالية. ننصح بتطبيق هذه الطرق في أعمالك اليومية باستخدام Python.