مشكلة وحل 16: حل خطأ PermissionError في Python عند فتح الملفات

حل خطأ PermissionError في Python عند فتح الملفات أو الكتابة عليها للمبتدئين

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

في هذا المقال من سلسلة مشكلة وحل في بايثون على موقع بايثون العرب سنشرح خطأ PermissionError بطريقة عملية: لماذا يظهر عند فتح الملفات؟ ما علاقة الصلاحيات بالملف؟ ماذا يحدث إذا كان الملف مفتوحًا في Excel؟ ولماذا لا يجب الكتابة داخل مجلدات النظام؟ وكيف تكتب كودًا آمنًا يتعامل مع الخطأ بطريقة واضحة؟

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

الفكرة ببساطة: خطأ PermissionError يعني أن Python حاول قراءة ملف أو الكتابة فيه، لكن النظام رفض العملية بسبب الصلاحيات أو لأن الملف مستخدم أو لأن المسار غير مناسب. {alertInfo}

شكل خطأ PermissionError في Python

قد يظهر الخطأ بهذا الشكل:

PermissionError: [Errno 13] Permission denied: 'data.txt'

أو عند محاولة فتح ملف CSV:

PermissionError: [Errno 13] Permission denied: 'students.csv'

وقد يظهر عند محاولة الكتابة داخل مجلد محمي:

PermissionError: [Errno 13] Permission denied: 'C:\\Program Files\\data.txt'

معنى الرسالة ببساطة: لا توجد صلاحية كافية لتنفيذ العملية المطلوبة على هذا الملف أو المسار.

مثال بسيط يسبب PermissionError

لنفترض أنك تحاول الكتابة داخل ملف موجود في مجلد محمي، أو ملف مفتوح في برنامج آخر:

with open("students.csv", "w", encoding="utf-8") as file:
    file.write("name,grade\nAli,90")

إذا كان الملف مفتوحًا في Excel أو لا تملك صلاحية الكتابة عليه، فقد يظهر PermissionError.


شرح سبب ظهور خطأ PermissionError في Python عند عدم توفر صلاحية الوصول للملف

ما معنى PermissionError؟

كلمة Permission تعني "صلاحية". عندما يقول Python PermissionError فهذا يعني أن نظام التشغيل رفض العملية، وليس بالضرورة أن Python نفسه لا يعرف ماذا يفعل.

قد تكون العملية المرفوضة واحدة من الآتي:

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

إذًا الحل ليس دائمًا في تغيير سطر واحد فقط، بل في فهم سبب رفض النظام للعملية.

السبب الأول: الملف مفتوح في برنامج آخر

هذا من أشهر أسباب PermissionError عند التعامل مع ملفات CSV أو Excel أو الملفات النصية. مثلًا إذا كان ملف students.csv مفتوحًا في Excel، ثم حاولت Python الكتابة عليه، قد يمنع النظام عملية الكتابة.

مثال:

with open("students.csv", "w", encoding="utf-8", newline="") as file:
    file.write("name,grade\nAli,90")

إذا ظهر الخطأ، جرّب إغلاق الملف من Excel أو أي برنامج آخر، ثم شغل الكود مرة أخرى.

حل سريع: أغلق الملف من Excel أو محرر النصوص أو أي برنامج يستخدمه، ثم أعد تشغيل سكربت Python. {alertSuccess}

حل PermissionError عندما يكون الملف مفتوحًا في برنامج آخر مثل Excel أو محرر النصوص

السبب الثاني: محاولة الكتابة داخل مجلد محمي

بعض المجلدات في النظام تحتاج إلى صلاحيات خاصة، مثل:

C:\Program Files
C:\Windows
C:\Users\Public
/System
/usr/bin

إذا حاولت إنشاء ملف داخل مجلد محمي، قد يظهر PermissionError.

مثال غير مناسب:

with open("C:\\Program Files\\data.txt", "w", encoding="utf-8") as file:
    file.write("Hello")

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

مثال أفضل:

with open("data.txt", "w", encoding="utf-8") as file:
    file.write("Hello")

بهذا سيتم إنشاء الملف داخل مجلد المشروع الحالي.


حل خطأ PermissionError عند محاولة الكتابة داخل مجلد محمي أو مسار يحتاج صلاحيات

السبب الثالث: فتح مجلد بدل ملف

أحيانًا يكون المسار الذي تحاول فتحه هو مجلد وليس ملفًا. مثلًا:

with open("data", "r", encoding="utf-8") as file:
    content = file.read()

إذا كان data مجلدًا، فقد يظهر خطأ مثل PermissionError أو خطأ آخر حسب النظام.

الحل أن تحدد اسم الملف كاملًا:

with open("data/students.txt", "r", encoding="utf-8") as file:
    content = file.read()

تأكد دائمًا أن المسار يشير إلى ملف وليس مجلدًا.

السبب الرابع: الملف للقراءة فقط Read-only

إذا كان الملف مضبوطًا كملف للقراءة فقط، فقد تستطيع قراءته ولكن لا تستطيع الكتابة عليه.

مثال قد يسبب المشكلة:

with open("report.txt", "w", encoding="utf-8") as file:
    file.write("New content")

الحل:

  • تأكد من خصائص الملف.
  • أزل خيار Read-only إذا كنت تريد التعديل عليه.
  • أو اكتب في ملف جديد داخل مجلد مشروعك.

السبب الخامس: استخدام وضع فتح غير مناسب

أحيانًا يكون الخطأ بسبب استخدام وضع فتح غير مناسب. مثلًا تحاول الكتابة في ملف مفتوح للقراءة:

with open("data.txt", "r", encoding="utf-8") as file:
    file.write("Hello")

هنا الوضع "r" يعني قراءة فقط. إذا أردت الكتابة استخدم "w" أو "a".

الوضع المعنى متى أستخدمه؟
"r" قراءة فقط عندما تريد قراءة الملف
"w" كتابة من جديد عندما تريد إنشاء ملف أو استبدال محتواه
"a" إضافة في نهاية الملف عندما تريد إضافة بيانات دون حذف القديم
"x" إنشاء ملف جديد فقط عندما تريد منع استبدال ملف موجود
تنبيه: وضع "w" يمسح محتوى الملف القديم. إذا كنت تريد الإضافة فقط، استخدم "a". {alertWarning}

السبب السادس: لا تملك صلاحية المستخدم المناسبة

في بعض الحالات، قد يكون الملف أو المجلد مملوكًا لمستخدم آخر أو يحتاج صلاحيات مدير النظام. هذا يحدث أكثر في بيئات العمل أو السيرفرات أو بعض مجلدات النظام.

في هذه الحالة لديك أكثر من خيار:

  • استخدم مجلدًا داخل مشروعك بدل مجلد النظام.
  • غيّر صلاحيات الملف أو المجلد إذا كنت تملك حق ذلك.
  • شغّل البرنامج بصلاحيات مناسبة عند الضرورة.
  • لا تجعل برنامجك يعتمد على الكتابة في مجلدات محمية.

بالنسبة للمبتدئين، الأفضل دائمًا أن تجعل ملفات البرنامج داخل مجلد المشروع.

طريقة حل PermissionError خطوة بخطوة

عندما يظهر لك الخطأ، لا تبدأ بتغيير الكود عشوائيًا. اتبع الخطوات التالية:

  1. تأكد أن المسار يشير إلى ملف وليس مجلدًا.
  2. تأكد أن اسم الملف والامتداد صحيحان.
  3. إذا كنت تكتب داخل الملف، أغلقه من Excel أو أي برنامج آخر.
  4. تأكد أنك لا تكتب داخل مجلد محمي مثل Program Files.
  5. جرّب الكتابة داخل مجلد مشروعك بدل المسار المحمي.
  6. تأكد أن الملف ليس Read-only.
  7. استخدم وضع الفتح المناسب: "r" للقراءة، "w" للكتابة، "a" للإضافة.
  8. استخدم try و except PermissionError لعرض رسالة مفهومة.

حل عملي باستخدام try و except

يمكنك التعامل مع الخطأ بطريقة واضحة بدل توقف البرنامج:

try:
    with open("students.csv", "w", encoding="utf-8", newline="") as file:
        file.write("name,grade\nAli,90")

except PermissionError:
    print("لا توجد صلاحية للكتابة على الملف.")
    print("أغلق الملف من أي برنامج آخر أو اختر مجلدًا تملك صلاحية الكتابة فيه.")

بهذه الطريقة يحصل المستخدم على رسالة مفهومة بدل رسالة خطأ طويلة.

حل PermissionError مع ملفات CSV

عند التعامل مع CSV، أكثر حالة شائعة هي أن الملف مفتوح في Excel. إذا كنت تكتب ملف CSV، استخدم هذا الشكل:

import csv

try:
    with open("students.csv", "w", encoding="utf-8", newline="") as file:
        writer = csv.writer(file)
        writer.writerow(["name", "grade"])
        writer.writerow(["Ali", 90])

except PermissionError:
    print("لا يمكن الكتابة في ملف CSV.")
    print("تأكد أن الملف غير مفتوح في Excel.")

إذا كان الملف مفتوحًا في Excel، أغلقه ثم شغل البرنامج مرة أخرى.

استخدام pathlib للتحقق من المسار

يمكنك استخدام pathlib للتأكد هل المسار ملف أم مجلد قبل فتحه.

from pathlib import Path

path = Path("data")

if path.is_dir():
    print("هذا المسار مجلد وليس ملفًا.")

elif path.is_file():
    print("هذا المسار ملف.")

else:
    print("المسار غير موجود.")

هذه الطريقة تساعدك على اكتشاف أخطاء المسارات قبل محاولة فتح الملف.

إنشاء مجلد آمن للكتابة

بدل الكتابة في مكان عشوائي، يمكنك إنشاء مجلد داخل مشروعك باسم output والكتابة فيه.

from pathlib import Path

output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

file_path = output_dir / "result.txt"

with file_path.open("w", encoding="utf-8") as file:
    file.write("تم إنشاء الملف بنجاح")

هذا أسلوب جيد للمشاريع التعليمية، لأنه يجعل الملفات الناتجة منظمة داخل مجلد معروف.

هل تشغيل Python كمسؤول يحل المشكلة؟

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

استخدم تشغيل البرنامج كمسؤول فقط عندما تعرف السبب جيدًا، وليس كحل عشوائي لكل مشكلة.

نصيحة مهمة: لا تجعل برنامجك يكتب في مجلدات النظام. اجعل ملفات الإدخال والإخراج داخل مجلد المشروع مثل data و output. {alertSuccess}

الفرق بين PermissionError و FileNotFoundError

قد يختلط الأمر على المبتدئ بين PermissionError و FileNotFoundError. الفرق بسيط:

الخطأ المعنى مثال السبب
FileNotFoundError Python لم يجد الملف اسم الملف خطأ أو المسار غير صحيح
PermissionError Python وجد المسار لكن لا يملك صلاحية الوصول الملف مفتوح في برنامج آخر أو المجلد محمي

إذا لم يكن الملف موجودًا أصلًا، فالمشكلة غالبًا FileNotFoundError. أما إذا كان موجودًا لكن النظام يمنعك من الوصول إليه، فغالبًا PermissionError.

مقارنة سريعة بين الأسباب والحلول

السبب الحل
الملف مفتوح في Excel أو برنامج آخر أغلق الملف ثم أعد تشغيل الكود
الكتابة داخل مجلد محمي اكتب داخل مجلد المشروع أو مجلد output
المسار يشير إلى مجلد وليس ملفًا اكتب اسم الملف كاملًا مع الامتداد
الملف Read-only غيّر خصائص الملف أو اكتب في ملف جديد
وضع الفتح غير مناسب استخدم "r" أو "w" أو "a" حسب الحاجة
صلاحيات المستخدم غير كافية غيّر مكان الملف أو عدّل الصلاحيات إذا كنت مخولًا

أفضل ممارسات تجنب PermissionError عند قراءة وكتابة الملفات في Python

أفضل ممارسات لتجنب PermissionError

  • احفظ ملفات المشروع داخل مجلد المشروع نفسه.
  • استخدم مجلد data للملفات التي تقرأ منها.
  • استخدم مجلد output للملفات التي ينشئها البرنامج.
  • لا تكتب داخل مجلدات النظام مثل Program Files أو Windows.
  • أغلق ملفات CSV من Excel قبل أن تكتب عليها باستخدام Python.
  • تأكد أن المسار يشير إلى ملف وليس مجلدًا.
  • استخدم وضع الفتح المناسب: "r" أو "w" أو "a".
  • استخدم try و except PermissionError لعرض رسالة واضحة.
  • لا تستخدم صلاحيات المدير إلا عند الحاجة الحقيقية.

تدريب عملي

اكتب برنامجًا يحاول إنشاء ملف باسم result.txt داخل مجلد output. إذا لم يكن المجلد موجودًا، أنشئه. وإذا حدث PermissionError، اطبع رسالة واضحة.

المطلوب:

  1. استخدم pathlib.
  2. أنشئ مجلد output باستخدام mkdir.
  3. اكتب ملف result.txt.
  4. تعامل مع PermissionError.

حل مختصر للتدريب

from pathlib import Path

try:
    output_dir = Path("output")
    output_dir.mkdir(exist_ok=True)

    file_path = output_dir / "result.txt"

    with file_path.open("w", encoding="utf-8") as file:
        file.write("تم حفظ النتيجة بنجاح")

    print("تم إنشاء الملف داخل مجلد output.")

except PermissionError:
    print("لا توجد صلاحية للكتابة في هذا المكان.")
    print("جرّب تشغيل المشروع داخل مجلد تملك صلاحية الكتابة فيه.")

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

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

الخلاصة

خطأ PermissionError في Python يظهر عندما يرفض نظام التشغيل عملية قراءة أو كتابة أو تعديل ملف بسبب الصلاحيات. من أشهر أسبابه أن الملف مفتوح في برنامج آخر، أو أن المسار داخل مجلد محمي، أو أن الملف للقراءة فقط، أو أنك تحاول فتح مجلد بدل ملف.

الحل يبدأ بفحص السبب: أغلق الملف من البرامج الأخرى، اكتب داخل مجلد مشروعك، استخدم وضع الفتح المناسب، وتأكد أن المسار صحيح. ولجعل برنامجك أفضل، استخدم try و except PermissionError لعرض رسالة واضحة بدل توقف البرنامج فجأة.

الخلاصة العملية: إذا ظهر PermissionError، تأكد أولًا أن الملف غير مفتوح في برنامج آخر، وأنك تكتب داخل مجلد تملك صلاحية الكتابة فيه، وأن المسار يشير إلى ملف صحيح. {alertSuccess}

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

ما معنى PermissionError في Python؟

يعني أن Python حاول الوصول إلى ملف أو مجلد، لكن نظام التشغيل رفض العملية بسبب الصلاحيات.

لماذا يظهر PermissionError عند كتابة ملف CSV؟

غالبًا لأن ملف CSV مفتوح في Excel أو لأنك لا تملك صلاحية الكتابة في المجلد الموجود فيه الملف.

هل تشغيل Python كمسؤول يحل PermissionError؟

قد يحله في بعض الحالات، لكنه ليس الحل الأفضل دائمًا. الأفضل اختيار مجلد مناسب داخل المشروع بدل الكتابة في مجلدات محمية.

ما الفرق بين PermissionError و FileNotFoundError؟

FileNotFoundError يعني أن الملف غير موجود، أما PermissionError فيعني أن المسار موجود غالبًا لكن الوصول إليه مرفوض.

كيف أتجنب PermissionError عند كتابة الملفات؟

اكتب داخل مجلد مشروعك، أغلق الملف من البرامج الأخرى، استخدم وضع الفتح الصحيح، وتجنب مجلدات النظام المحمية.

هل يمكن التعامل مع PermissionError باستخدام try و except؟

نعم. يمكنك استخدام except PermissionError لعرض رسالة واضحة للمستخدم بدل توقف البرنامج.

إرسال تعليق

أحدث أقدم