أساسيات بايثون 26: شرح مكتبة pathlib في Python للتعامل مع مسارات الملفات بطريقة حديثة

أساسيات بايثون 26 شرح مكتبة pathlib في Python للتعامل مع مسارات الملفات والمجلدات بطريقة حديثة

في الدرس السابق من كورس أساسيات بايثون تعلمنا التعامل مع الملفات والمجلدات باستخدام مكتبة os، ورأينا كيف نستخدم أوامر مثل os.getcwd() و os.listdir() و os.path.join() و os.path.exists().

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

{getToc} $title={محتوى المقال}

الفكرة ببساطة: مكتبة pathlib تساعدك على التعامل مع مسارات الملفات والمجلدات ككائنات واضحة بدل التعامل معها كنصوص عادية فقط. {alertInfo}

هذا الدرس مهم جدًا إذا كنت تريد بناء مشاريع Python مرتبة، أو التعامل مع ملفات داخل مجلدات مختلفة، أو قراءة وكتابة ملفات نصية، أو فحص وجود ملف قبل استخدامه، أو إنشاء مجلدات بطريقة حديثة وسهلة.

ما هي مكتبة pathlib في Python؟

مكتبة pathlib هي مكتبة قياسية في Python تُستخدم للتعامل مع مسارات الملفات والمجلدات بطريقة حديثة. وهي تأتي مع Python، لذلك لا تحتاج إلى تثبيتها باستخدام pip.

بدل أن تكتب المسار كنص عادي مثل:

file_path = "data/info.txt"

يمكنك استخدام Path من مكتبة pathlib بهذا الشكل:

from pathlib import Path

file_path = Path("data") / "info.txt"

print(file_path)

قد يبدو الأمر غريبًا في البداية، خصوصًا استخدام علامة / بين أجزاء المسار، لكن هذه من أجمل ميزات pathlib لأنها تجعل بناء المسارات واضحًا وسهل القراءة.

لماذا نستخدم pathlib بدل كتابة المسارات يدويًا؟

عندما تكون في بداية تعلم Python، قد تكتب المسارات كنصوص مباشرة. هذا قد يعمل في أمثلة بسيطة، لكنه يصبح مزعجًا عندما يكبر المشروع، أو عندما تنقل المشروع بين Windows و Linux و macOS.

استخدام pathlib يعطيك عدة فوائد:

  • كتابة أوضح وأسهل لمسارات الملفات.
  • تقليل مشاكل اختلاف شكل المسارات بين أنظمة التشغيل.
  • فحص وجود الملفات والمجلدات بسهولة.
  • إنشاء المجلدات بطريقة منظمة.
  • قراءة وكتابة الملفات النصية بأوامر مختصرة.
  • كود أكثر نظافة عند بناء مشاريع حقيقية.
نصيحة مهمة: إذا كنت تتعلم Python لبناء مشاريع حقيقية، فلا تتعامل مع المسارات كنصوص عشوائية طوال الوقت. تعلم pathlib مبكرًا سيوفر عليك الكثير من المشاكل لاحقًا. {alertSuccess}

استدعاء Path من مكتبة pathlib

أكثر طريقة شائعة لاستخدام pathlib هي استدعاء Path بهذا الشكل:

from pathlib import Path

بعد هذا السطر يمكنك استخدام Path لإنشاء مسار ملف أو مجلد:

from pathlib import Path

folder = Path("data")

print(folder)

الناتج:

data

هنا لم ننشئ مجلدًا فعليًا بعد، بل أنشأنا كائنًا يمثل المسار فقط. بمعنى أن Path("data") يشير إلى مسار اسمه data، لكنه لا يعني بالضرورة أن المجلد موجود على الجهاز.

معرفة المجلد الحالي باستخدام Path.cwd

من أكثر الأوامر التي ستستخدمها في pathlib هو الأمر Path.cwd(). هذا الأمر يعرض المجلد الحالي الذي يعمل منه البرنامج.

from pathlib import Path

current_folder = Path.cwd()

print(current_folder)

قد يظهر لك ناتج مثل:

/home/user/python_project

أو في Windows قد يظهر مثل:

C:\Users\User\Desktop\python_project

هذا الأمر يشبه os.getcwd() الذي شرحناه في درس مكتبة os، لكنه يعيد لك كائنًا من نوع Path بدل نص عادي فقط.

شرح معرفة المجلد الحالي ومجلد المستخدم في Python باستخدام Path.cwd و Path.home من مكتبة pathlib

معرفة مجلد المستخدم باستخدام Path.home

إذا أردت معرفة مجلد المستخدم الرئيسي على الجهاز، يمكنك استخدام Path.home().

from pathlib import Path

home_folder = Path.home()

print(home_folder)

قد يظهر الناتج في Linux أو macOS مثل:

/home/user

وفي Windows قد يظهر مثل:

C:\Users\User

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

بناء مسارات الملفات باستخدام علامة /

من أجمل ميزات pathlib أنك تستطيع بناء المسارات باستخدام علامة / بطريقة سهلة جدًا.

from pathlib import Path

file_path = Path("data") / "info.txt"

print(file_path)

الناتج غالبًا:

data/info.txt

المعنى: لدينا مجلد اسمه data، وداخله ملف اسمه info.txt.

ويمكنك بناء مسار أطول:

from pathlib import Path

file_path = Path("project") / "data" / "reports" / "summary.txt"

print(file_path)

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

قاعدة عملية: عند بناء مسارات في Python باستخدام pathlib، استخدم Path("folder") / "file.txt" بدل لصق النصوص يدويًا. {alertInfo}
مثال بناء مسارات الملفات في Python باستخدام pathlib و Path بطريقة حديثة بدل os.path.join

المقارنة بين pathlib و os.path.join

في مكتبة os كنا نستخدم os.path.join() لبناء المسارات:

import os

file_path = os.path.join("data", "info.txt")

أما في pathlib فيمكننا كتابة:

from pathlib import Path

file_path = Path("data") / "info.txt"
الطريقة مثال الملاحظة
os.path.join os.path.join("data", "info.txt") طريقة قديمة ومستخدمة كثيرًا، لكنها تعتمد على دوال منفصلة.
pathlib Path("data") / "info.txt" طريقة حديثة وأوضح، وتجعل المسار كائنًا يمكن التعامل معه مباشرة.

لا يعني هذا أن os.path.join() خاطئة. هي ما زالت تعمل ومفيدة، لكن pathlib غالبًا أوضح في المشاريع الجديدة، خاصة عندما تحتاج تنفيذ أكثر من عملية على نفس المسار.

فحص وجود ملف أو مجلد باستخدام exists

قبل أن تقرأ ملفًا أو تتعامل مع مجلد، من الأفضل أن تتأكد أنه موجود. في pathlib نستخدم الدالة exists().

from pathlib import Path

file_path = Path("data") / "info.txt"

if file_path.exists():
    print("الملف أو المجلد موجود")
else:
    print("المسار غير موجود")

هذه الطريقة تقابل تقريبًا os.path.exists()، لكنها تُكتب مباشرة على كائن المسار.

الفرق بين exists و is_file و is_dir

الدالة exists() تخبرك فقط أن المسار موجود، لكنها لا تخبرك هل هو ملف أم مجلد. لذلك نستخدم:

  • is_file() لمعرفة هل المسار ملف.
  • is_dir() لمعرفة هل المسار مجلد.
from pathlib import Path

path = Path("data")

if path.is_file():
    print("هذا ملف")
elif path.is_dir():
    print("هذا مجلد")
else:
    print("المسار غير موجود أو نوعه غير معروف")
معلومة مهمة: استخدم exists() عندما تريد معرفة هل المسار موجود عمومًا، واستخدم is_file() أو is_dir() عندما تريد التأكد من نوع المسار. {alertInfo}
شرح فحص وجود الملفات والمجلدات في Python باستخدام exists و is_file و is_dir من pathlib

عرض أجزاء المسار باستخدام pathlib

لنفترض أن لدينا مسار ملف بهذا الشكل:

from pathlib import Path

file_path = Path("data") / "reports" / "summary.txt"

يمكننا استخراج معلومات مفيدة من المسار:

print(file_path.name)
print(file_path.stem)
print(file_path.suffix)
print(file_path.parent)

الناتج:

summary.txt
summary
.txt
data/reports
الخاصية وظيفتها مثال الناتج
name اسم الملف مع الامتداد summary.txt
stem اسم الملف بدون الامتداد summary
suffix امتداد الملف .txt
parent المجلد الأب الذي يحتوي الملف data/reports

هذه الخصائص مفيدة عندما تريد التعامل مع أسماء الملفات، أو معرفة الامتداد، أو تنظيم الملفات حسب النوع.

قراءة ملف نصي باستخدام read_text

في الدروس السابقة تعلمنا استخدام open() لقراءة الملفات. مع pathlib يمكن قراءة الملف بطريقة مختصرة باستخدام read_text().

from pathlib import Path

file_path = Path("notes.txt")

content = file_path.read_text(encoding="utf-8")

print(content)

هذا الكود يقرأ محتوى الملف notes.txt ويحفظه داخل المتغير content.

تنبيه: إذا كان الملف غير موجود، سيظهر خطأ. لذلك في المشاريع الحقيقية من الأفضل فحص وجود الملف باستخدام exists() أو التعامل مع الخطأ باستخدام try و except. {alertWarning}

يمكنك مراجعة درس شرح try و except في Python والتعامل مع الأخطاء لفهم كيفية منع توقف البرنامج عند ظهور مشكلة.

كتابة ملف نصي باستخدام write_text

لإنشاء ملف نصي أو كتابة نص داخل ملف باستخدام pathlib، نستخدم write_text().

from pathlib import Path

file_path = Path("message.txt")

file_path.write_text("مرحبًا بك في بايثون العرب", encoding="utf-8")

بعد تشغيل الكود، سيتم إنشاء ملف باسم message.txt إذا لم يكن موجودًا، وسيتم كتابة النص داخله.

لكن انتبه: إذا كان الملف موجودًا مسبقًا، فإن write_text() ستستبدل محتواه القديم بالمحتوى الجديد.

تحذير مهم: قبل استخدام write_text() على ملف مهم، تأكد أنك لا تحتاج المحتوى القديم، لأن الكتابة بهذه الطريقة قد تستبدل المحتوى السابق. {alertWarning}
مثال قراءة وكتابة الملفات النصية في Python باستخدام read_text و write_text من مكتبة pathlib

مثال عملي: قراءة ملف بعد التأكد من وجوده

في هذا المثال سنجمع بين exists() و read_text(). سنفحص هل الملف موجود، ثم نقرأه إذا كان موجودًا.

from pathlib import Path

file_path = Path("notes.txt")

if file_path.exists() and file_path.is_file():
    content = file_path.read_text(encoding="utf-8")
    print(content)
else:
    print("الملف غير موجود")

هذا مثال ممتاز للمبتدئ؛ لأنه يجعلك تكتب كودًا أكثر أمانًا بدل محاولة قراءة ملف غير موجود مباشرة.

إنشاء مجلد باستخدام mkdir

يمكنك إنشاء مجلد باستخدام mkdir() في pathlib.

from pathlib import Path

folder_path = Path("reports")

folder_path.mkdir()

هذا ينشئ مجلدًا باسم reports. لكن إذا كان المجلد موجودًا مسبقًا، قد يظهر خطأ. لذلك الأفضل استخدام:

from pathlib import Path

folder_path = Path("reports")

folder_path.mkdir(exist_ok=True)

استخدام exist_ok=True يعني: إذا كان المجلد موجودًا مسبقًا، لا تظهر خطأ.

إنشاء مسار كامل من عدة مجلدات

إذا أردت إنشاء مسار يحتوي على أكثر من مجلد، مثل:

reports/2026/june

استخدم parents=True مع mkdir().

from pathlib import Path

folder_path = Path("reports") / "2026" / "june"

folder_path.mkdir(parents=True, exist_ok=True)

هنا:

  • parents=True يسمح بإنشاء المجلدات الأب إذا لم تكن موجودة.
  • exist_ok=True يمنع ظهور خطأ إذا كان المسار موجودًا مسبقًا.
قاعدة مفيدة: عند إنشاء مسار كامل لمجلدات متعددة، استخدم mkdir(parents=True, exist_ok=True) حتى يكون الكود أكثر مرونة. {alertSuccess}

عرض الملفات والمجلدات باستخدام iterdir

في مكتبة os كنا نستخدم os.listdir() لعرض محتويات مجلد. في pathlib يمكننا استخدام iterdir().

from pathlib import Path

folder_path = Path(".")

for item in folder_path.iterdir():
    print(item)

النقطة "." تعني المجلد الحالي.

ويمكنك عرض الملفات فقط:

from pathlib import Path

folder_path = Path(".")

for item in folder_path.iterdir():
    if item.is_file():
        print("ملف:", item.name)

وعرض المجلدات فقط:

from pathlib import Path

folder_path = Path(".")

for item in folder_path.iterdir():
    if item.is_dir():
        print("مجلد:", item.name)

البحث عن ملفات بامتداد معين باستخدام glob

إذا أردت البحث عن ملفات بامتداد معين، مثل جميع ملفات .txt داخل مجلد، يمكنك استخدام glob().

from pathlib import Path

folder_path = Path(".")

for file in folder_path.glob("*.txt"):
    print(file.name)

هذا الكود يعرض كل الملفات النصية داخل المجلد الحالي.

وإذا أردت البحث داخل المجلدات الفرعية أيضًا، استخدم rglob():

from pathlib import Path

folder_path = Path(".")

for file in folder_path.rglob("*.txt"):
    print(file)

هنا سيبحث Python عن ملفات .txt داخل المجلد الحالي وكل المجلدات الموجودة داخله.

تغيير اسم ملف باستخدام rename

يمكنك تغيير اسم ملف باستخدام rename().

from pathlib import Path

old_file = Path("old_name.txt")
new_file = Path("new_name.txt")

if old_file.exists():
    old_file.rename(new_file)
    print("تم تغيير اسم الملف")
else:
    print("الملف غير موجود")

حذف ملف باستخدام unlink

لحذف ملف باستخدام pathlib، نستخدم unlink().

from pathlib import Path

file_path = Path("temp.txt")

if file_path.exists() and file_path.is_file():
    file_path.unlink()
    print("تم حذف الملف")
else:
    print("الملف غير موجود")
تحذير: لا تجرب أوامر الحذف على ملفات مهمة. أنشئ ملفات تجريبية أولًا حتى تفهم السلوك جيدًا. {alertWarning}

مشروع صغير: إنشاء مجلد تقارير وحفظ ملف داخله

الآن سنطبق درس pathlib في مثال عملي. نريد إنشاء مجلد باسم reports، ثم إنشاء ملف داخله باسم summary.txt، ثم قراءة محتوى الملف.

from pathlib import Path

reports_folder = Path("reports")
reports_folder.mkdir(exist_ok=True)

report_file = reports_folder / "summary.txt"

report_file.write_text("هذا تقرير تجريبي باستخدام pathlib.", encoding="utf-8")

content = report_file.read_text(encoding="utf-8")

print(content)

هذا المثال يجمع بين:

  • إنشاء مسار مجلد.
  • إنشاء مجلد إذا لم يكن موجودًا.
  • بناء مسار ملف داخل المجلد.
  • كتابة نص داخل ملف.
  • قراءة النص من الملف.

مشروع صغير: عرض تقرير عن محتويات المجلد الحالي

في هذا المثال سنبني برنامجًا يعرض الملفات والمجلدات الموجودة داخل المجلد الحالي، ويطبع نوع كل عنصر.

from pathlib import Path

current_folder = Path.cwd()

print("المجلد الحالي:", current_folder)
print("-" * 40)

for item in current_folder.iterdir():
    if item.is_file():
        print("ملف:", item.name)
    elif item.is_dir():
        print("مجلد:", item.name)

هذا المثال قريب من أمثلة os.listdir()، لكنه يستخدم أسلوب pathlib الحديث.

أهم أوامر pathlib للمبتدئين

الأمر وظيفته مثال
Path.cwd() معرفة المجلد الحالي Path.cwd()
Path.home() معرفة مجلد المستخدم Path.home()
Path("data") / "file.txt" بناء مسار ملف Path("data") / "info.txt"
exists() فحص وجود المسار file_path.exists()
is_file() فحص هل المسار ملف file_path.is_file()
is_dir() فحص هل المسار مجلد folder_path.is_dir()
mkdir() إنشاء مجلد folder_path.mkdir()
iterdir() عرض محتويات مجلد folder_path.iterdir()
glob() البحث عن ملفات بنمط معين folder_path.glob("*.txt")
read_text() قراءة ملف نصي file_path.read_text()
write_text() كتابة ملف نصي file_path.write_text("Hello")
unlink() حذف ملف file_path.unlink()

أخطاء شائعة عند استخدام pathlib

1. الاعتقاد أن Path ينشئ الملف أو المجلد مباشرة

عندما تكتب:

path = Path("data")

أنت لا تنشئ مجلدًا فعليًا. أنت فقط تنشئ كائنًا يمثل المسار. لإنشاء المجلد فعلًا يجب استخدام:

path.mkdir()

2. نسيان استدعاء Path

إذا كتبت Path بدون استدعائها، سيظهر خطأ:

NameError: name 'Path' is not defined

الحل:

from pathlib import Path

3. استخدام read_text على ملف غير موجود

إذا حاولت قراءة ملف غير موجود، سيظهر خطأ. الأفضل:

if file_path.exists():
    content = file_path.read_text(encoding="utf-8")

4. حذف ملف بدون التأكد من نوعه

قبل استخدام unlink()، تأكد أن المسار ملف:

if file_path.exists() and file_path.is_file():
    file_path.unlink()

متى أستخدم pathlib ومتى أستخدم os؟

لا توجد قاعدة تقول إن os خطأ و pathlib صحيح دائمًا. كلاهما مفيد، لكن الاختيار يعتمد على نوع الكود والمشروع.

الحالة الأفضل غالبًا السبب
بناء مشروع جديد يتعامل مع ملفات ومسارات pathlib أسلوب حديث وأوضح وأسهل في القراءة.
فهم أكواد قديمة أو شروحات منتشرة os و os.path كثير من الأكواد القديمة تستخدم os.
بناء مسار ملف أو مجلد pathlib الكتابة باستخدام / واضحة وسهلة.
تنفيذ عمليات متكررة على نفس المسار pathlib يمكن استخدام الدوال مباشرة على كائن المسار.
استخدام دوال نظام تشغيل منخفضة المستوى os مكتبة os تحتوي أدوات أوسع للتعامل مع النظام.

إذا كنت مبتدئًا، تعلم الاثنين بشكل مبسط. افهم os لأنه موجود في كثير من الأكواد، وتعلم pathlib لأنه أنظف وأحدث في كتابة المشاريع الجديدة.

تمرين تطبيقي على pathlib

حاول تنفيذ التمرين التالي:

  1. أنشئ ملفًا باسم pathlib_practice.py.
  2. استدع Path من مكتبة pathlib.
  3. اطبع المجلد الحالي باستخدام Path.cwd().
  4. أنشئ مجلدًا باسم notes إذا لم يكن موجودًا.
  5. أنشئ ملفًا داخل المجلد باسم first_note.txt.
  6. اكتب داخل الملف: تعلم pathlib يجعل التعامل مع المسارات أسهل.
  7. اقرأ محتوى الملف واطبعه.

الحل المقترح:

from pathlib import Path

print("المجلد الحالي:", Path.cwd())

notes_folder = Path("notes")
notes_folder.mkdir(exist_ok=True)

note_file = notes_folder / "first_note.txt"

note_file.write_text("تعلم pathlib يجعل التعامل مع المسارات أسهل.", encoding="utf-8")

content = note_file.read_text(encoding="utf-8")

print(content)

روابط داخلية مفيدة من بايثون العرب

لفهم هذا الدرس بشكل أفضل، يمكنك مراجعة هذه الدروس من موقع بايثون العرب:

مصادر خارجية رسمية للتوسع

بعد فهم الأساسيات، يمكنك الرجوع إلى التوثيق الرسمي للتوسع أكثر:

الخلاصة

مكتبة pathlib من أهم المكتبات التي تساعدك على كتابة كود أنظف عند التعامل مع مسارات الملفات والمجلدات في Python. بدل التعامل مع المسار كنص عادي فقط، يمكنك التعامل معه ككائن يحتوي على دوال وخصائص مفيدة مثل exists() و is_file() و is_dir() و mkdir() و read_text() و write_text().

إذا كنت تتعلم Python للمشاريع العملية، ففهم pathlib سيجعلك أكثر راحة عند بناء برامج تتعامل مع الملفات والمجلدات، خصوصًا عندما تبدأ في تنظيم المشاريع، قراءة البيانات، إنشاء التقارير، أو البحث عن ملفات داخل مجلدات مختلفة.

الخلاصة العملية: استخدم Path.cwd() لمعرفة المجلد الحالي، واستخدم Path("folder") / "file.txt" لبناء المسارات، واستخدم exists() و is_file() و is_dir() لفحص الملفات والمجلدات بطريقة واضحة. {alertSuccess}

أسئلة شائعة مع إجاباتها

هل أحتاج إلى تثبيت مكتبة pathlib؟

لا. مكتبة pathlib من مكتبات Python القياسية، لذلك لا تحتاج إلى تثبيتها باستخدام pip. فقط استدعها باستخدام from pathlib import Path.

ما فائدة pathlib في Python؟

تُستخدم pathlib للتعامل مع مسارات الملفات والمجلدات بطريقة حديثة وواضحة، مثل بناء المسارات، فحص وجود الملفات، إنشاء المجلدات، وقراءة وكتابة الملفات النصية.

ما الفرق بين pathlib و os؟

مكتبة os أقدم وأوسع في التعامل مع نظام التشغيل، أما pathlib فهي أكثر تركيزًا على التعامل مع المسارات بطريقة حديثة ككائنات واضحة وسهلة القراءة.

كيف أعرف المجلد الحالي باستخدام pathlib؟

استخدم:

from pathlib import Path

print(Path.cwd())

كيف أبني مسار ملف باستخدام pathlib؟

يمكنك استخدام علامة / بين أجزاء المسار:

from pathlib import Path

file_path = Path("data") / "info.txt"

كيف أفحص هل الملف موجود باستخدام pathlib؟

استخدم exists():

if file_path.exists():
    print("المسار موجود")

كيف أنشئ مجلدًا باستخدام pathlib؟

استخدم mkdir():

folder_path.mkdir(exist_ok=True)

كيف أقرأ ملفًا نصيًا باستخدام pathlib؟

استخدم read_text():

content = file_path.read_text(encoding="utf-8")

هل pathlib أفضل من os.path.join؟

في المشاريع الجديدة، pathlib غالبًا أوضح وأسهل في القراءة، لكن os.path.join() ما زالت مستخدمة ومفيدة، خصوصًا عند قراءة أكواد قديمة أو شروحات تستخدم مكتبة os.

إرسال تعليق

أحدث أقدم