كيفية التحقق من وجود الملفات في بايثون

درسنا لنها اليوم سيكون حول التحقق من وجود ملف أو دليل ما أو لا بإستخدام بعض الدوال المدمجة والوظائف من المكتبة القياسية لبايثون .

القدرة على التحقق من وجود ملف ما على القرص الصلب ليس بالشيء المهم لدي الكثير من المبرمجين  ولكن:

ربما تريد التحقق من وجود البيانات على القرص قبل تحميلها أو ربما تريد منع حصول الكتابة على ملف موجود من قبل ونفس الشيء بالنسبة للدليل لربما تريد التحقق من موجود الدليل قبل تشغيل البرنامج .

ومع بايثون هناك العديد من الطرق للتحقق من وجود ملف أو دليل ما بإستخدام الدوال المدمجة في اللغة إفتراضيا والمكتبة القياسية لبايثون.

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

الخيار الأول :

الطريقة الشائعة للتحقق من وجود أي دليل أو ملف هي بإستخدام كل من الدالتين : exists()و  isfile() من الوحدة  os.path  الموجودة في المكتبة القياسية.

هاتين الدالتين موجودتان في كل من نسختي بايثون 2 و 3 و عادة مايتم إقتراحهما في المقام الأول عند البحث عن حل لهذه المشكلة على محركات البحث أو وثائق بايثون .

وفي مايلي سنقدم مثال عن كيفية إستعمال دالة ()os.path.exists حيث سنقوم بالبحث عن عدة مسارات (ملفات ودليل) ما إذا كانا موجودين أم لا .


>>> import os.path
>>> os.path.exists('mydirectory/myfile.txt')
True
>>> os.path.exists('does-not-exist.txt')
False
>>> os.path.exists('mydirectory')
True

كما رأيتم فإن إستدعاء دالة ()os.path.exists يعطينا صح أو خطأ (True أو False ) وإذا كنت تريد التأكد من أن المسار عبارة عن ملف أو دليل فعليك بإستخدام دالة ()os.path.isfile.


>>> import os.path
>>> os.path.isfile('mydirectory/myfile.txt')
True
>>> os.path.isfile('does-not-exist.txt')
False
>>> os.path.isfile('mydirectory')
False

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

وبدون إطالة دعونا ننتقل إلى الخيار الثاني للتحقق من وجود الأدلة و الملفات على المسارات المختلفة .

الخيار الثاني :

لقد رأينا للتو كيفية إستخدام وحدة os.path للتحقق من وجودة الأدلة والملفات وسننتقل الأن إلى الطريقة الثانية وهي عبارة عن خوارزمية بايثون للتحقق من وجود ملف ما على أي مسار وهي بكل بساطة محاولة فتح ذلك الملف بإستخدام الدالة المدمجة ()Open .

>>> open('does-not-exist.txt')
FileNotFoundError:
"[Errno 2] No such file or directory: 'does-not-exist.txt'"

بعد تنفيذ الكوذ السابق وفي حالة وجود الملف المطلوب في المسار سيتم فتح الملف بشكل عادي أما في حالة عدم وجود الملف في المسار سيظهر إستثناء  FileNotFoundError.

وهذا يعني أنه يمكننا تخصيص الكود الخاص بنا وإستخدامه للكشف عن وجود الملف من عدمه، وفي مايلي لكود الذي يوضح العملية .


try:
    f = open('myfile.txt')
    f.close()
except FileNotFoundError:
    print('File does not exist')

قد تلاحظون أن قمت بإستدعاء التابع ()close مباشرة على كائن الملف لكي نرفع أيدينا عن الملف الأساسي وهذه الطريقة تعد من المهارات الأساسية عند التعامل مع الملفات .

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

إن عملية فتح الملفات تضمن أيضا أن هذا الأخير يمكن الوصول إليه فضلا إلى أنه موجود وبدلا من إنتظار إستثناء FileNotFoundError سنقوم بكتابة إستثناء خاص بنا


try:
    f = open('myfile.txt')
    f.close()
except IOError:
    print('File is not accessible')
print('File is accessible')

إذا كنت من الذين يستخدمون كثيرا هكذا نوع من الأنماط يمكنك إضافة مايسمى ب مساعد الدالة


def is_accessible(path, mode='r'):
"""
Check if the file or directory at `path` can
be accessed by the program using `mode` open flags.
"""
try:
    f = open(path, mode)
    f.close()
except IOError:
    return False
return True

يمكننا أيضا إستخدام دالة ()os.access الموجودة في المكتبة القياسية حيث تقوم بالتأكد من وجود الملف و إمكانية الوصول إليه في نفس الوقت .

الخيار الثالث : (بايثون 3.4 فما فوق )

جاءت نسخة بايثون 3.4 فما فوق بوحدة جديد تحت إسم  pathlib  التي توفر واجهة البرمجة الكائنية للتعامل مع مسارات ملفات النظام وبإستعمال هذه الوحدة سيكون العمل أسهل وجيد بالمقارنة كائنات السلاسل البسيطة .

وللتحقق من إذا ما كان المسار يشير إلى ملف صالح يمكننا إستعمال أسلوب  Path.exists() ولمعرفة ما إذا كان المسار عبارة عن ملف أو ملف رمزي بدلا من دليل يمكنك إستخدام أسلوب  Path.is_file().

وفي مايلي مثال عملي يوضح العملية


>>> import pathlib
>>> path = pathlib.Path('myfile.txt')
>>> path.exists()
True
>>> path.is_file()
True

كما تلاحظ هذه الطريقة مشابهة لطريقة التي قمنا بها في الخيار الأول بإستخدام وحدة os.path

جوهر الفرق يكمن في ان pathlib  يوفر واجهة للبرمجة الكائنية للتعامل مع ملفات النظام ولا داعي للتعامل مع كائنات السلسلة لتمثيل مسارات الملفات وبالمقابل أنت تتعامل مع كائنات المسارات مع أساليب وصفات ذات صلة بها.

كما تجعل pathlib الكود سهل القراءة وقابل للصيانة وأنا لا أقول أنها وصفة سحرية لجميع المشاكل ولكنها الخيار الأفضل في معظم الحالات .

 

أرجوا أن تقوم بدعمنا عبر نشرك والاعجاب بالموقع

One Thought on “كيفية التحقق من وجود الملفات في بايثون

  1. جميل ، اتمنى طريقة كتابة برنامج لطباعة جميع المفات بكامل صيَغها في المجلد الحالي .وشكرا

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Post Navigation