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

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

خطأ PermissionError في Python يعني أن نظام التشغيل رفض عملية مثل قراءة ملف أو الكتابة فيه أو تعديل مجلد بسبب عدم توفر صلاحية كافية. وقد تظهر الرسالة بصيغ شائعة مثل PermissionError: [Errno 13] Permission denied، أو على Windows بصيغة PermissionError: [WinError 5] Access is denied.

في هذا المقال من سلسلة مشكلة وحل في بايثون على موقع بايثون العرب ستتعلم كيف تحدد السبب الصحيح قبل تغيير الكود: هل المسار يشير إلى مجلد بدل ملف؟ هل الملف مفتوح في Excel؟ هل تحاول الكتابة داخل مجلد محمي؟ هل الملف Read-only؟ ثم سنطبق حلولًا عملية مع الملفات وCSV وtry/except.

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

الفكرة ببساطة: إذا ظهر PermissionError أو [Errno 13] Permission denied، فابدأ بفحص المسار وصلاحياته وحالة الملف. لا تستخدم تشغيل Python كمسؤول كحل أول؛ غالبًا يكفي إغلاق الملف أو اختيار مسار تملك حق الكتابة فيه. {alertInfo}

شكل خطأ PermissionError و Permission denied في 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'

وعلى Windows قد ترى أيضًا:

PermissionError: [WinError 5] Access is denied

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

ما الفرق بين PermissionError و Errno 13 و WinError 5؟

PermissionError هو اسم الاستثناء في Python عندما تُرفض عملية بسبب عدم توفر حقوق وصول مناسبة. أما Errno 13 وWinError 5 فهما رمزان قد يظهران داخل رسالة الخطأ لتوضيح سبب الرفض على مستوى نظام التشغيل.

الرسالة ماذا تعني؟
PermissionError الاستثناء الذي تعرضه Python عندما يرفض النظام العملية بسبب الصلاحيات.
[Errno 13] Permission denied رسالة شائعة تعني رفض الوصول إلى الملف أو المجلد.
[WinError 5] Access is denied صيغة خاصة بـWindows تدل على أن النظام رفض العملية أو الوصول المطلوب.

مثال بسيط يسبب 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
/System
/usr/bin
/etc

إذا حاولت إنشاء ملف داخل مجلد محمي، قد يظهر 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 في بعض البيئات، بينما قد يظهر IsADirectoryError في بيئات أخرى. لذلك لا تفترض أن كل مشكلة مسار هي مشكلة صلاحيات؛ تحقق أولًا هل المسار ملف أم مجلد.

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

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 إذا كنت تريد التعديل عليه.
  • أو اكتب في ملف جديد داخل مجلد مشروعك.

خطأ قريب: الكتابة في ملف مفتوح للقراءة فقط

إذا فتحت الملف بوضع "r" ثم استدعيت write()، فهذه ليست عادةً حالة PermissionError. Python ترفع غالبًا io.UnsupportedOperation: not writable لأن كائن الملف نفسه لا يسمح بالكتابة:

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

إذًا فرّق بين رفض نظام التشغيل للوصول، وهو PermissionError، وبين استخدام عملية لا يدعمها وضع فتح الملف. إذا أردت الكتابة استخدم "w" أو "a" حسب حاجتك.

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

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

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

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

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

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

حل PermissionError و WinError 5 على Windows

إذا ظهرت الرسالة PermissionError: [WinError 5] Access is denied على Windows، فابدأ بتحديد العملية التي رفضها النظام. أكثر الحالات ارتباطًا بهذا المقال هي الوصول إلى ملف أو مجلد محمي، محاولة تعديل ملف مستخدم في برنامج آخر، أو تمرير مسار مجلد إلى كود يتوقع ملفًا.

  • أغلق الملف من Excel أو Word أو أي برنامج يستخدمه.
  • تأكد أن المسار ينتهي باسم الملف إذا كانت الدالة تتوقع ملفًا.
  • انقل ملف الإدخال أو الإخراج إلى مجلد المستخدم أو مجلد المشروع بدل مجلدات النظام.
  • تحقق من خاصية Read-only وصلاحيات حساب المستخدم.
  • استخدم Run as Administrator فقط إذا كانت العملية تحتاج فعلًا إلى صلاحيات مرتفعة، وليس كحل افتراضي.

إذا ظهر Permission denied أثناء تثبيت مكتبة عبر pip فهذه حالة مختلفة عن فتح ملفات المشروع؛ راجع شرح pip وتثبيت مكتبات بايثون بدل توسيع مشكلة الملفات إلى موضوع إدارة الحزم.

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

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

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

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

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

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، أغلقه ثم شغل البرنامج مرة أخرى. وللتوسع في بنية ملفات CSV نفسها، راجع شرح ملفات CSV في Python.

استخدام 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 و IsADirectoryError

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

الخطأ المعنى مثال السبب
FileNotFoundError Python لم يجد الملف اسم الملف خطأ أو المسار غير صحيح
PermissionError نظام التشغيل رفض العملية بسبب عدم توفر حق وصول مناسب الملف مفتوح في برنامج آخر أو المجلد محمي
IsADirectoryError تم طلب عملية خاصة بالملفات على مسار هو مجلد تمرير مسار مجلد إلى عملية تتوقع ملفًا

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

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

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

أفضل ممارسات تجنب 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 يظهر عندما يرفض نظام التشغيل عملية قراءة أو كتابة أو تعديل بسبب عدم توفر حقوق وصول مناسبة، وقد تراه بصيغة [Errno 13] Permission denied أو على Windows بصيغة [WinError 5] Access is denied. من أشهر أسبابه أن الملف مفتوح في برنامج آخر، أو أن المسار داخل مجلد محمي، أو أن الملف للقراءة فقط.

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

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

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

ما معنى PermissionError في Python؟

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

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

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

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

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

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

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

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

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

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

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

ما معنى [Errno 13] Permission denied في Python؟

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

ما معنى [WinError 5] Access is denied في Python؟

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

إرسال تعليق

أحدث أقدم