من أكثر الأخطاء التي تظهر للمبتدئين عند التعامل مع الملفات في Python خطأ FileNotFoundError. يظهر هذا الخطأ غالبًا عندما يحاول البرنامج فتح ملف غير موجود، أو عندما يكون الملف موجودًا فعلًا لكن Python يبحث عنه في مجلد مختلف عن الذي تتوقعه.
في هذا المقال من سلسلة مشكلة وحل في بايثون سنتعلم معنى خطأ FileNotFoundError، وسبب ظهور رسالة No such file or directory، وكيف تحل المشكلة خطوة بخطوة بطريقة عملية، خصوصًا عند استخدام open أو التعامل مع مسارات الملفات.
{getToc} $title={محتوى المقال}
الفكرة ببساطة: خطأ FileNotFoundError يعني أن Python حاول الوصول إلى ملف أو مسار، لكنه لم يجده في المكان الذي يبحث فيه. {alertInfo}
شكل الخطأ
قد يظهر لك الخطأ بهذا الشكل:
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'
ومعناه أن Python حاول فتح ملف اسمه data.txt لكنه لم يجد هذا الملف في المسار الحالي الذي يعمل منه البرنامج.
مثال كود يسبب هذا الخطأ:
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
إذا لم يكن ملف data.txt موجودًا في نفس المجلد الذي يعمل منه البرنامج، ستظهر رسالة FileNotFoundError.
ما معنى FileNotFoundError؟
كلمة FileNotFoundError تعني حرفيًا: خطأ بسبب أن الملف غير موجود. لكن في الواقع، السبب لا يكون دائمًا أن الملف غير موجود نهائيًا. أحيانًا يكون الملف موجودًا، لكن البرنامج يبحث عنه في مكان آخر.
مثال بسيط:
project/
│
├── main.py
└── files/
└── data.txt
إذا كتبت داخل main.py:
open("data.txt")
قد يظهر الخطأ؛ لأن الملف ليس بجانب main.py مباشرة، بل داخل مجلد اسمه files. لذلك المسار الصحيح يكون:
open("files/data.txt")
أشهر أسباب ظهور FileNotFoundError
هناك عدة أسباب شائعة تؤدي إلى ظهور هذا الخطأ:
- الملف غير موجود فعلًا.
- اسم الملف مكتوب بطريقة خاطئة.
- امتداد الملف غير صحيح، مثل كتابة
data.txtبينما الملف اسمهdata.csv. - الملف موجود لكن في مجلد مختلف.
- تشغل البرنامج من مجلد غير الذي تتوقعه.
- استخدام مسار يحتوي على أحرف أو شرطات غير صحيحة.
- نسيان كتابة اسم المجلد قبل اسم الملف.
- الاعتماد على مسار نسبي بدون معرفة المجلد الحالي.
الفرق بين المسار النسبي والمسار الكامل
لفهم هذا الخطأ جيدًا، يجب أن تفهم الفرق بين نوعين من المسارات: المسار النسبي و المسار الكامل.
المسار النسبي
المسار النسبي هو مسار يعتمد على مكان تشغيل البرنامج. مثل:
data.txt
files/data.txt
../data.txt
هذا النوع من المسارات قد يسبب ارتباكًا للمبتدئين؛ لأن Python يبحث عن الملف نسبةً إلى المجلد الحالي الذي شغلت منه البرنامج.
المسار الكامل
المسار الكامل هو المسار الذي يبدأ من جذر النظام أو القرص. مثال على Windows:
C:\Users\Elia\Desktop\data.txt
ومثال على Linux أو macOS:
/home/user/Desktop/data.txt
المسار الكامل يكون أوضح أحيانًا، لكنه أقل مرونة إذا نقلت المشروع إلى جهاز آخر.
كيف تعرف المجلد الذي يعمل منه البرنامج؟
أحيانًا تظن أن البرنامج يعمل من مجلد معين، لكن Python يعمل من مجلد آخر. لمعرفة المجلد الحالي، يمكنك استخدام مكتبة os:
import os
print(os.getcwd())
الأمر getcwd يعرض لك المجلد الحالي الذي يبحث فيه Python عند استخدام مسار نسبي.
مثال:
C:\Users\Elia\Desktop\my_project
إذا ظهر هذا المسار، فهذا يعني أن Python سيبحث عن data.txt داخل مجلد my_project إذا كتبت:
open("data.txt")
الحل الأول: تأكد أن الملف موجود فعلًا
قبل التفكير في حلول معقدة، تأكد أولًا أن الملف موجود فعلًا في المجلد الصحيح.
إذا كان الكود هكذا:
open("data.txt")
فيجب أن يكون الملف بجانب ملف Python الذي تشغله أو داخل المجلد الحالي الذي يعمل منه البرنامج.
تأكد من:
- اسم الملف مكتوب بشكل صحيح.
- الامتداد صحيح:
.txtأو.csvأو.json. - لا توجد مسافة زائدة في اسم الملف.
- الملف ليس داخل مجلد آخر.
الحل الثاني: اكتب المسار الصحيح للملف
إذا كان الملف داخل مجلد فرعي، لا تكتب اسم الملف فقط، بل اكتب اسم المجلد معه.
مثال هيكل المشروع:
project/
│
├── main.py
└── data/
└── users.txt
الخطأ:
open("users.txt")
الصحيح:
open("data/users.txt")
لأن الملف موجود داخل مجلد data وليس في نفس مكان ملف التشغيل.
الحل الثالث: استخدم pathlib لبناء المسارات
من الطرق الأفضل في المشاريع العملية استخدام مكتبة pathlib لبناء المسارات بطريقة أوضح وأكثر تنظيمًا.
from pathlib import Path
file_path = Path("data") / "users.txt"
with file_path.open("r", encoding="utf-8") as file:
content = file.read()
print(content)
هذه الطريقة أفضل من دمج النصوص يدويًا، لأنها تجعل المسار أوضح وتناسب أنظمة التشغيل المختلفة.
الحل الرابع: افحص وجود الملف قبل فتحه
يمكنك فحص وجود الملف قبل محاولة فتحه، حتى تتجنب ظهور الخطأ مباشرة.
from pathlib import Path
file_path = Path("data.txt")
if file_path.exists():
content = file_path.read_text(encoding="utf-8")
print(content)
else:
print("الملف غير موجود")
بهذا الشكل لن يتوقف البرنامج فجأة، بل سيعرض رسالة واضحة إذا لم يجد الملف.
الحل الخامس: استخدم try و except
طريقة أخرى جيدة هي استخدام try و except للتعامل مع الخطأ إذا حدث.
try:
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("عذرًا، الملف غير موجود.")
هذه الطريقة مفيدة عندما يكون غياب الملف احتمالًا طبيعيًا في البرنامج، وتريد عرض رسالة مناسبة للمستخدم بدل ظهور خطأ طويل.
مهم: استخدامtryوexceptلا يعني تجاهل المشكلة. استخدمه لعرض رسالة واضحة أو تنفيذ بديل مناسب عند عدم وجود الملف. {alertWarning}
الحل السادس: إذا كنت تريد إنشاء الملف استخدم وضع الكتابة
إذا كنت تريد قراءة الملف، تستخدم الوضع "r". لكن إذا كان هدفك إنشاء ملف جديد، استخدم الوضع "w".
هذا الكود يسبب خطأ إذا لم يكن الملف موجودًا:
open("notes.txt", "r")
أما هذا الكود ينشئ الملف إذا لم يكن موجودًا:
with open("notes.txt", "w", encoding="utf-8") as file:
file.write("مرحبا من بايثون")
انتبه: الوضع "w" قد يستبدل محتوى الملف إذا كان موجودًا. إذا أردت الإضافة بدون حذف المحتوى السابق، استخدم الوضع "a".
| وضع الفتح | المعنى | ماذا يحدث إذا لم يكن الملف موجودًا؟ |
|---|---|---|
"r" |
قراءة | يظهر FileNotFoundError |
"w" |
كتابة | ينشئ الملف |
"a" |
إضافة في نهاية الملف | ينشئ الملف |
"x" |
إنشاء ملف جديد فقط | ينشئ الملف إذا لم يكن موجودًا، ويعطي خطأ إذا كان موجودًا |
الحل السابع: انتبه لاستخدام الشرطة العكسية في Windows
في Windows قد تكتب مسارًا مثل:
C:\new_folder\data.txt
لكن داخل النصوص في Python قد تسبب الشرطة العكسية \ مشاكل؛ لأن بعض التركيبات مثل \n تعني سطرًا جديدًا.
لذلك يمكنك استخدام أحد هذه الحلول:
استخدام شرطة عكسية مزدوجة
path = "C:\\new_folder\\data.txt"
استخدام raw string
path = r"C:\new_folder\data.txt"
استخدام الشرطة المائلة العادية
path = "C:/new_folder/data.txt"
لكن في المشاريع التعليمية، الأفضل غالبًا أن تستخدم pathlib بدل كتابة المسارات الطويلة يدويًا.
مثال عملي كامل: قراءة ملف بأمان
في المثال التالي سنقرأ ملفًا من مجلد data بطريقة أكثر أمانًا. إذا كان الملف موجودًا، نقرأ محتواه. وإذا لم يكن موجودًا، نعرض رسالة واضحة.
from pathlib import Path
file_path = Path("data") / "students.txt"
if file_path.exists():
content = file_path.read_text(encoding="utf-8")
print(content)
else:
print("لم يتم العثور على الملف:", file_path)
هذا المثال مناسب للمشاريع الصغيرة، لأنه يجعل مسار الملف واضحًا، ويتحقق من وجود الملف قبل محاولة قراءته.
قائمة فحص سريعة لحل الخطأ
عندما يظهر لك خطأ FileNotFoundError، راجع هذه النقاط بالترتيب:
| السؤال | ما الذي تراجعه؟ |
|---|---|
| هل الملف موجود؟ | تأكد أن الملف موجود فعلًا في المشروع. |
| هل الاسم صحيح؟ | راجع الحروف، المسافات، والامتداد. |
| هل الملف داخل مجلد؟ | اكتب اسم المجلد ضمن المسار مثل data/file.txt. |
| من أين يعمل البرنامج؟ | استخدم os.getcwd() لمعرفة المجلد الحالي. |
| هل تستخدم Windows؟ | انتبه للشرطة العكسية أو استخدم pathlib. |
| هل تريد القراءة أم الإنشاء؟ | استخدم "r" للقراءة، و "w" أو "a" للإنشاء أو الكتابة. |
أخطاء شائعة مرتبطة بهذا الخطأ
1. إنشاء الملف في مكان وتشغيل الكود من مكان آخر
قد تضع الملف على سطح المكتب، ثم تشغل الكود من مجلد المشروع. في هذه الحالة لن يجده Python إذا كتبت اسم الملف فقط.
2. اختلاف الامتداد الحقيقي للملف
في Windows قد يظهر الملف باسم data فقط، لكنه في الحقيقة data.txt أو data.csv. تأكد من إظهار امتدادات الملفات من إعدادات النظام.
3. الاعتماد على السحب والإفلات دون معرفة المسار
قد تفتح الملف من محرر كود، لكن هذا لا يعني أن مسار التشغيل هو نفس مكان الملف. لذلك من المهم معرفة المجلد الحالي.
4. استخدام اسم مجلد خطأ
إذا كان المجلد اسمه files وكتبت file أو data، سيظهر الخطأ لأن المسار غير مطابق.
مثال خطأ وحله
لنفترض أن هيكل المشروع هكذا:
my_project/
│
├── main.py
└── data/
└── names.txt
الكود الخطأ:
with open("names.txt", "r", encoding="utf-8") as file:
print(file.read())
سبب الخطأ أن الملف داخل مجلد data. الحل:
with open("data/names.txt", "r", encoding="utf-8") as file:
print(file.read())
أو باستخدام pathlib:
from pathlib import Path
file_path = Path("data") / "names.txt"
with file_path.open("r", encoding="utf-8") as file:
print(file.read())
روابط داخلية مفيدة من بايثون العرب
- سلسلة مشكلة وحل في بايثون
- كورس أساسيات بايثون للمبتدئين
- أساسيات بايثون 22: التعامل مع الملفات في Python
- شرح مكتبة pathlib في Python للمبتدئين
- ماذا تتعلم بعد أساسيات بايثون؟ خريطة طريق عملية للمستوى المتوسط
مصادر خارجية مفيدة للتوسع
- توثيق Python الرسمي لخطأ FileNotFoundError
- توثيق Python الرسمي لمكتبة pathlib
- توثيق Python الرسمي حول قراءة وكتابة الملفات
الخلاصة
خطأ FileNotFoundError في Python يظهر عندما يحاول البرنامج فتح ملف أو مسار غير موجود في المكان الذي يبحث فيه. السبب قد يكون أن الملف غير موجود فعلًا، أو أن الاسم أو الامتداد غير صحيح، أو أن الملف داخل مجلد آخر، أو أنك تشغل البرنامج من مسار مختلف.
لحل المشكلة، ابدأ بالتأكد من وجود الملف واسمه الصحيح، ثم راجع المسار، واستخدم os.getcwd() لمعرفة المجلد الحالي، ويفضل استخدام pathlib لبناء المسارات بطريقة أوضح. وإذا كان غياب الملف احتمالًا طبيعيًا، استخدم try و except أو افحص وجود الملف قبل فتحه.
الخلاصة العملية: إذا ظهر لك FileNotFoundError، لا تفترض مباشرة أن الكود خطأ. راجع مكان الملف، اسم الملف، امتداده، والمجلد الذي يعمل منه البرنامج. {alertSuccess}
أسئلة شائعة مع إجاباتها
ما معنى FileNotFoundError في Python؟
يعني أن Python حاول فتح ملف أو مسار لكنه لم يجده في المكان الذي يبحث فيه.
هل يعني الخطأ أن الملف غير موجود نهائيًا؟
ليس دائمًا. قد يكون الملف موجودًا، لكن Python يبحث عنه في مجلد آخر أو أن المسار المكتوب غير صحيح.
كيف أعرف المجلد الحالي الذي يعمل منه Python؟
يمكنك استخدام os.getcwd() لعرض المجلد الحالي الذي يعمل منه البرنامج.
ما الفرق بين r و w عند فتح الملفات؟
الوضع "r" يستخدم للقراءة ويحتاج أن يكون الملف موجودًا. أما "w" فيستخدم للكتابة وينشئ الملف إذا لم يكن موجودًا، لكنه قد يستبدل محتوى الملف إذا كان موجودًا.
هل pathlib أفضل من open العادي؟
ليست بديلة عن open دائمًا، لكنها تساعدك على بناء المسارات وفحص الملفات بطريقة أوضح وأكثر تنظيمًا، خصوصًا في المشاريع العملية.
كيف أتجنب FileNotFoundError؟
تأكد من اسم الملف وامتداده، واكتب المسار الصحيح، وافحص وجود الملف قبل فتحه، واستخدم pathlib أو try/except عند الحاجة.



