في الدرس السابق من كورس أساسيات بايثون تعلمنا التعامل مع الملفات والمجلدات باستخدام مكتبة 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 بدل نص عادي فقط.
معرفة مجلد المستخدم باستخدام 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}
المقارنة بين 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}
عرض أجزاء المسار باستخدام 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}
مثال عملي: قراءة ملف بعد التأكد من وجوده
في هذا المثال سنجمع بين 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
حاول تنفيذ التمرين التالي:
- أنشئ ملفًا باسم
pathlib_practice.py. - استدع
Pathمن مكتبةpathlib. - اطبع المجلد الحالي باستخدام
Path.cwd(). - أنشئ مجلدًا باسم
notesإذا لم يكن موجودًا. - أنشئ ملفًا داخل المجلد باسم
first_note.txt. - اكتب داخل الملف:
تعلم pathlib يجعل التعامل مع المسارات أسهل. - اقرأ محتوى الملف واطبعه.
الحل المقترح:
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)
روابط داخلية مفيدة من بايثون العرب
لفهم هذا الدرس بشكل أفضل، يمكنك مراجعة هذه الدروس من موقع بايثون العرب:
- كورس أساسيات بايثون للمبتدئين
- شرح مكتبة os في Python للتعامل مع الملفات والمجلدات
- شرح التعامل مع الملفات في Python للمبتدئين
- شرح try و except في Python والتعامل مع الأخطاء
- شرح Modules و import في Python للمبتدئين
مصادر خارجية رسمية للتوسع
بعد فهم الأساسيات، يمكنك الرجوع إلى التوثيق الرسمي للتوسع أكثر:
- توثيق Python الرسمي لمكتبة pathlib
- توثيق Python الرسمي لوحدة os.path
- توثيق Python الرسمي حول قراءة وكتابة الملفات
الخلاصة
مكتبة 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.




