7 طرق للتحقق من وجود ملف أو مجلد في بايثون
نشرت: 2021-06-16تحتوي مكتبة Python القياسية على معظم الوظائف التي سيحتاجها المطور لحل مشكلة ما. في هذا البرنامج التعليمي ، ستتعلم طرقًا مختلفة للتحقق من وجود ملف أو دليل باستخدام الوحدات المدمجة فقط.
يعد التحقق مما إذا كان الملف أو البرنامج النصي في المكان الصحيح أمرًا بالغ الأهمية لأي برنامج CLI. يمكن أن يصبح برنامجك عديم الفائدة إذا لم يكن ملف معين في مكانه في لحظة التنفيذ.
في البرنامج التعليمي اليوم ، ستتعلم بعض الطرق السريعة للتحقق من وجود ملف أو مجلد في Python.
قبل البدء
قبل تنفيذ أي أمر أدناه ، تأكد من تثبيت Python 3 في نظامك. افتح Terminal واكتب الأمر التالي:
python --version # Python 3.9.5, my resultإذا كان لديك إصدار 2.x ، فستحتاج إلى استخدام الأمر "python3". راجع دليل تثبيت Python الخاص بنا إذا لم يكن لديك Python 3 مثبتًا.
سنستخدم بعض ملفات الاختبار مع هذا البرنامج التعليمي ، لذا تأكد من إنشاء الملفات التالية:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txtتُنشئ الأوامر أعلاه ملفًا للعب به ، ودليل اختبار ، وملف آخر داخل دليل الاختبار . يمكن أن تكون الملفات فارغة لأننا لن نحتاج إلى قراءة محتواها ،
ملاحظة: إذا كنت تستخدم Windows ، فقم بإعداد بنية ملف بسيطة لهذا الملف باستخدام مدير ملفات رسومي.
أخيرًا ، سنستخدم Ipython كصدفة Python التفاعلية التي توفر واجهة جميلة للعمل معها. هذه مجرد سلعة ، وبالتالي فهي ليست ضرورية تمامًا.
pip install ipythonبعد القيام بذلك ، ستتمكن من الوصول إلى قشرة Python الجميلة بمجرد كتابة ipython .

أنت الآن جاهز تمامًا ، دعنا نتعمق في طرق للتحقق مما إذا كان هناك مجلد أو ملف موجود في Python.
جرب ، افتح ، وباستثناء
هذا هو الخيار الأكثر مباشرة. إذا حاولت فتح ملف غير موجود ، فسيقوم Python برفع FileNotFoundError.
In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'يمكننا الاستفادة من هذا ، والتعامل مع الاستثناء في حالة عدم وجود الملف الذي نبحث عنه.
In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\' exist') ...: exit() ...: Sorry the file we're looking for doesn't existفي الكود أعلاه نطبع رسالة مخصصة ونوقف تنفيذ البرنامج إذا لم يكن الملف موجودًا.
لاحظ كيف سيتم تنفيذ وظيفة exit () فقط في حالة ظهور استثناء. دعونا نرى ما يحدث عندما يكون الملف الذي نبحث عنه موجودًا بالفعل.
In [2]: try: ...: file = open('testfile.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>لاحظ كيف نقوم بإغلاق الملف مباشرة بعد فتحه. تعتبر ممارسة جيدة وفقًا لوثائق بايثون.
استدعاء
<span class="pre">file.write()</span>بدون استخدام<span class="pre">with</span>الكلمة الرئيسية أو استدعاء<span class="pre">file.close()</span>قد يؤدي إلى عدم كتابة وسيطات<span class="pre">file.write()</span>بشكل كامل على القرص ، حتى إذا تم إنهاء البرنامج بنجاح.
حتى لو لم نكتب إلى الملف ، يوصى بشدة بإغلاق الملف لأنه قد يؤدي إلى مشاكل متعددة في الأداء.
إذا لم نرغب في إغلاق الملف بأنفسنا ، فيمكننا استخدام مع مدير السياق. يقوم بتخصيص الموارد وإصدارها بدقة ، لذلك لن نحتاج إلى إغلاق الملف.
In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # No need to close the file ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>هذه الطريقة مفيدة للغاية عند الكتابة في الملفات ، ولكنها تؤدي إلى عدم فاعلية إذا أردنا فقط التحقق من وجود الملف. دعنا نتعمق في الخيارات الأخرى لتحقيق ذلك.
os.path.exists ()
توفر وحدة نظام التشغيل وظائف متعددة للتفاعل مع نظام التشغيل. للتحقق من وجود ملف أو مجلد ، يمكننا استخدام المسار. موجود () وظيفة تقبل المسار إلى الملف أو الدليل كوسيطة. تقوم بإرجاع قيمة منطقية بناءً على وجود المسار.
ملاحظة: المسار هو المكان الفريد لملف أو دليل في نظام ملفات
في Python ، تحتوي الوحدة الفرعية os.path على وظائف مصممة خصيصًا للعمل مع مسارات الملفات. تقبل كل هذه الوظائف وسيطة المسار على هيئة سلاسل أو وحدات بايت ، ويمكنك أن تقرر العمل باستخدام مسارات مطلقة ، على سبيل المثال:
/home/daniel/.bashrcأو بالمسارات النسبية ، اعتمادًا على الدليل الذي تقوم بتشغيل البرنامج النصي:
.bashrc # Running the script in my home folderفيما يلي أمثلة متعددة باستخدام وظيفة os.path.exists () ، التي تعمل في الدليل حيث توجد ملفات الاختبار الخاصة بي:
In [1]: import os In [2]: os.path.exists('testfile.txt') Out[2]: True In [3]: os.path.exists('testdirectory') Out[3]: True In [4]: os.path.exists('hey-i-dont-exist') Out[4]: Falseكما ترى ، تقوم بإرجاع True عند الاختبار باستخدام ملف testfile.txt ومجلد testdirectory ، و False عند عدم وجود الملف.
os.path.isfile ()
إذا أردت إثبات وجود ملف فقط (وليس دليلًا) ، يمكنك استدعاء دالة os.path.isfile () .
In [1]: import os In [2]: os.path.isfile('testfile.txt') Out[2]: True In [3]: os.path.isfile('testdirectory/') Out[3]: False In [4]: os.path.isfile('i-dont-even-exist') Out[4]: False In [5]: os.path.isfile('testdirectory/otherfile.txt') Out[5]: Trueملاحظة: في نظام التشغيل UNIX ، تنتهي جميع المجلدات بشرطة مائلة للأمام (/) ، بينما في نظام التشغيل Windows ، نستخدم الشرطة المائلة للخلف (\).
في الكود أعلاه ، ترجع الدالة isfile () False في مناسبتين ، دعنا نرى لماذا:
-
testdirectory/دليل ، لذلك لا يعتبر ملفًا. هذا ليس صحيحًا تمامًا نظرًا لأن كل شيء في Linux هو واصف ملف ، لكن Python يعامل الدلائل بشكل مختلف فقط للراحة (إذا حاولت فتح دليل فستحصل على IsADirectoryError ) -
i-dont-even-existيشير إلى ملف غير موجود ومن المفارقات
os.path.isdir ()
إذا كنت تريد التحقق من وجود دليل في المكان الصحيح ، فستحتاج إلى استخدام دالة os.path.isdir () ، والتي تُرجع True فقط إذا كان المسار المحدد يشير إلى دليل.

In [1]: import os In [2]: os.path.isdir('testfile.txt') Out[2]: False In [3]: os.path.isdir('testdirectory') Out[3]: True In [4]: os.path.isdir('anotherfile.txt') Out[4]: Falseلاحظ كيف ترجع الأمثلة أعلاه False حتى عندما يشير المسار إلى ملف موجود.
الكرة الأرضية
توفر وحدة glob وظائف للعمل مع أنماط تشبه غلاف Unix (ومن ثم فهي لا تعمل بشكل صحيح على Windows). للتحقق مما إذا كان الملف يطابق نمطًا داخل الدليل الحالي ، يمكنك استخدام وظيفة glob.glob ().
In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']في الكود أعلاه ، النمط الذي تم تمريره إلى دالة glob هو سلسلة عادية تمثل المسار إلى ملف الاختبار والدليل. نظرًا لوجود كلا المسارين ، تقوم الوظيفة بإرجاع قائمة بأسماء المسار المطابقة بداخلها.
ملاحظة: إذا لم يتطابق النمط ، فستحصل على قائمة فارغة.
بالنظر إلى أنه يمكننا تمرير الأنماط إلى وظيفة glob ، فلماذا لا نختبر بعض المزايا الرئيسية لها؟
يحصل الكود أدناه على جميع مسارات الملفات ذات الامتداد .txt و .py على التوالي:
In [4]: glob.glob('*.txt') Out[4]: ['testfile.txt'] In [5]: glob.glob('*.py') Out[5]: ['pathlib-exists.py', 'list-dir.py', 'glob-file.py', 'open-except.py', 'subprocess-test.py', 'isfile.py', 'exists.py', 'isdir.py']استخدام فئة المسار
تعد فئة المسار واحدة من أفضل الطرق للعمل مع المسارات لأنها تعطينا واجهة نظيفة للعمل مع مسارات الملفات ككائنات.
تتمثل ميزة الكعكة في أن مثيلات المسار بها جميع الطرق التي تحتاجها للحصول على معلومات حول مسار معين. يتضمن هذا وظائف مماثلة للخيارات السابقة.
ملاحظة: ستحتاج إلى Python 3.4 أو إصدار أحدث لاستخدام مكتبة pathlib
طرق المسار التي ستستخدمها:
- المسار (). موجود ()
- المسار (). is_file ()
- المسار (). is_dir ()
تحقق من وجود مسار
In [1]: from pathlib import Path In [2]: Path('testfile.txt').exists() Out[2]: True In [3]: Path('im-not-here.txt').exists() Out[3]: False In [4]: Path('testdirectory').exists() Out[4]: Trueيعمل بنفس طريقة التشغيل os.path.exists () .
تحقق مما إذا كان المسار يشير إلى ملف
In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: Falseيعادل os.path.isfile () .
تحقق مما إذا كان المسار يشير إلى دليل
In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: Trueيتوافق مع os.path.isdir ().
عملية فرعية
إذا كنت من محبي وحدة العمليات الفرعية ، فستحتاج إلى معرفة المزيد عن هذا الخيار. يمكنك تحديد ما إذا كان الملف أو المجلد موجودًا باستخدام الأمر test.
ملاحظة: أمر الاختبار يعمل فقط في نظام التشغيل Unix.
ستؤدي علامات الاختبار التالية إلى إنجاز المهمة:
- test -e: تحقق من وجود المسار
- test -f: تحقق من وجود الملف
- test- د: تحقق من وجود مجلد
إذا كنت ترغب في الغوص في المزيد من علامات الاختبار ، يمكنك قراءة الدليل عن طريق تشغيل:
man testالتحقق من المسار بالعملية الفرعية:
يحدد الكود أدناه ما إذا كان المسار موجودًا عن طريق مقارنة كود الإرجاع للعملية الفرعية بالصفر.
تذكر أنه في نظام Linux ، إذا سارت العملية بشكل جيد ، فإنها ستعيد صفرًا ، وإذا لم يتم إرجاع أي رمز آخر.
In [1]: from subprocess import run In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0 Out[2]: True In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0 Out[3]: Falseفي العبارة الأولى ، نستورد وحدة العملية الفرعية ، ثم نستخدم وظيفة التشغيل ونحصل على كود الإرجاع الخاص بها.
التحقق من وجود ملف مع عملية فرعية
In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: Falseالتحقق من دليل مع عملية فرعية:
In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: Trueلا يوصى باستخدام هذا الخيار لأنه يستهلك المزيد من الموارد ، ولا نحصل على أي ميزة منه.
لنلخص
Python هي واحدة من أكثر لغات البرمجة استخدامًا لأتمتة العمليات من خلال التفاعل مع نظام التشغيل. أحد الأشياء الرائعة التي يمكنك القيام بها هو التحقق من وجود ملف أو مجلد.
أسهل طريقة للقيام بذلك هي:
- فتح ملفات الاستثناءات والتعامل معها على الفور
- استخدام الدالة الموجودة () لوحدات os.path أو pathlib النمطية.
تعلمت في هذا البرنامج التعليمي:
- كيفية فتح ملف والتعامل مع الاستثناءات في حالة عدم وجوده
- معنى المسارات
- 3 وظائف مختلفة توفرها الوحدة الفرعية os.path للتحقق من وجود ملف أو مجلد
- يستخدم Unix خطوط مائلة للأمام (/) ، بينما يستخدم Windows خطوط مائلة للخلف (\)
القراءة التالية: ما هي العملية الفرعية في بايثون؟ [5 أمثلة على الاستخدام]
