يُعد استرجاع جميع الملفات بكفاءة داخل دليل مهمة حاسمة في العديد من برامج بايثون، خاصة تلك التي تتضمن معالجة نظام الملفات أو معالجة البيانات أو الأتمتة. توفر بايثون عدة طرق قوية لتحقيق ذلك، لكل منها مزاياها وعيوبها. تستعرض هذه المقالة ثلاثة من الأساليب الشائعة: os.listdir
و os.walk
و glob.glob
، مما يرشدك إلى اختيار الطريقة الأنسب لاحتياجاتك المحددة.
جدول المحتويات
os.listdir
: سرد الملفات في دليل واحدos.walk
: التنقل في الدلائل بشكل متكررglob.glob
: تحديد الملفات القائمة على الأنماط- اختيار الطريقة الصحيحة
os.listdir
: سرد الملفات في دليل واحد
توفر دالة os.listdir()
أبسط طريقة للحصول على قائمة بجميع الإدخالات (الملفات والدلائل الفرعية) داخل دليل محدد. إنها تُرجع قائمة من السلاسل، كل منها يمثل اسم عنصر داخل هذا الدليل.
import os
def list_directory_files(directory):
"""يسرد جميع الملفات والدلائل في دليل معين.
Args:
directory: مسار الدليل.
Returns:
قائمة بأسماء الملفات (سلاسل) وأسماء الدلائل في الدليل المحدد.
ترجع قائمة فارغة إذا كان الدليل فارغًا أو غير موجود.
يطبع رسالة خطأ إذا لم يتم العثور على الدليل.
"""
try:
return os.listdir(directory)
except FileNotFoundError:
print(f"Error: Directory '{directory}' not found.")
return []
my_directory = "/path/to/your/directory" # استبدل بمسار الدليل الخاص بك
files_and_dirs = list_directory_files(my_directory)
print(files_and_dirs)
المزايا: بسيطة وفعالة لقوائم الدليل الواحد.
العيوب: لا تتجول بشكل متكرر في الدلائل الفرعية؛ توفر أسماء الملفات فقط، وليس المسارات الكاملة.
os.walk
: التنقل في الدلائل بشكل متكرر
للاستكشاف المتكرر للدلائل ودلائلها الفرعية، فإن os.walk()
هو الخيار الأمثل. فهو يُنتج وحدة ثلاثية 3-tuple لكل دليل: (root, dirs, files)
. root
هو مسار الدليل الحالي، و dirs
هي قائمة بأسماء الدلائل الفرعية، و files
تسرد أسماء الملفات داخل هذا الدليل.
import os
def get_all_files(directory):
"""يستعيد جميع الملفات بشكل متكرر داخل دليل ودلائله الفرعية.
Args:
directory: مسار الدليل.
Returns:
قائمة بمسارات الملفات الكاملة (سلاسل). ترجع قائمة فارغة إذا كان الدليل فارغًا أو غير موجود.
يطبع رسالة خطأ إذا لم يتم العثور على الدليل.
"""
all_files = []
try:
for root, _, files in os.walk(directory):
for file in files:
all_files.append(os.path.join(root, file))
return all_files
except FileNotFoundError:
print(f"Error: Directory '{directory}' not found.")
return []
my_directory = "/path/to/your/directory" # استبدل بمسار الدليل الخاص بك
all_files = get_all_files(my_directory)
print(all_files)
المزايا: يتجول بشكل متكرر في الدلائل الفرعية، مما يوفر مسارات الملفات الكاملة.
العيوب: أكثر تعقيدًا قليلاً من os.listdir()
.
glob.glob
: تحديد الملفات القائمة على الأنماط
توفر دالة glob.glob()
مطابقة مرنة لأسماء الملفات باستخدام أحرف بديلة على غرار نظام التشغيل shell. هذا مفيد بشكل خاص لتحديد الملفات بناءً على أنماط محددة (مثل، جميع الملفات .txt
، أو الملفات التي تبدأ بـ “report_”).
import glob
import os
def get_files_by_pattern(directory, pattern="*"):
"""يستعيد الملفات التي تطابق نمطًا داخل دليل.
Args:
directory: مسار الدليل.
pattern: نمط اسم الملف (الافتراضي هو "*", مطابقة جميع الملفات).
Returns:
قائمة بمسارات الملفات الكاملة (سلاسل) التي تطابق النمط.
ترجع قائمة فارغة إذا لم تطابق أي ملفات أو لم يكن الدليل موجودًا.
يطبع رسالة خطأ إذا لم يتم العثور على الدليل.
"""
try:
return glob.glob(os.path.join(directory, pattern))
except FileNotFoundError:
print(f"Error: Directory '{directory}' not found.")
return []
my_directory = "/path/to/your/directory" # استبدل بمسار الدليل الخاص بك
txt_files = get_files_by_pattern(my_directory, "*.txt")
print(txt_files)
all_files = get_files_by_pattern(my_directory)
print(all_files)
المزايا: إمكانيات مطابقة الأنماط القوية.
العيوب: أقل وضوحًا من os.listdir()
لقوائم بسيطة؛ لا تتجول بشكل متكرر في الدلائل الفرعية إلا إذا تم دمجها مع os.walk()
.
اختيار الطريقة الصحيحة
تعتمد الطريقة المثلى على متطلباتك المحددة:
- لقوائم بسيطة لدليل واحد، تكفي
os.listdir()
. - للتجول المتكرر في الدلائل ودلائلها الفرعية، فإن
os.walk()
هو الخيار الأفضل. - لاسترجاع الملفات الانتقائية باستخدام الأنماط، يوفر
glob.glob()
الحل الأكثر كفاءة.
تذكر تضمين معالجة الأخطاء المناسبة (مثل، FileNotFoundError
) للحصول على رمز قوي.