Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

بايثونالتعامل مع الملفات

  • معالجة الملفات
  • الدالة open()
  • دوال القراءة و الكتابة في الملفات
  • خصائص الملفات
  • الموديول os
  • البلوك with
  • تخزين أحرف عربية في الملف
  • التعامل مع الملفات بطريقة آمنة

معالجة الملفات

التعامل مع الملفات أو معالجة الملفات ( Files Handling ) يقصد منه إجراء عملية ما على الملفات مهما كان نوعها ( مثل txt - jpg - mp4 ).
في هذا الدرس ستتعلم كيف تقرأ محتوى ملف، كيف تنشئ نسخة منه، كيف تعدل محتواه، كيف تحذفه إلخ..

الدالة open()

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


بناؤها

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None)
  • مكان البارميتر file نمرر نص يمثل مسار الملف الذي سيتم إنشاؤه أو التعامل معه.
  • mode هو باراميتر إختياري، نمرر مكانه حرف ( أو أكثر ) يحدد كيف سنتعامل مع الملف، مثل: هل ننوي القراءة منه أو الكتابة فيه إلخ..
  • buffering هو باراميتر إختياري، مكانه يمكن تمرير عدد يحدد كيف سيتم تخزين الأحرف على دفعات بشكل مؤقت في الذاكرة أثناء الكتابة أو القراءة من الملف.
  • encoding هو باراميتر إختياري، مكانه يمكن تمرير إسم الترميز الذي يجب استخدامه عند التعامل مع الملف.
  • errors هو باراميتر إختياري، مكانه يمكن تمرير كلمة تحدد كيف سيتم التعامل مع الأخطاء التي قد تحدث عند التعامل مع الملف.
  • newline هو باراميتر إختياري، مكانه يمكن تمرير الرمز الذي يمثل نهاية كل سطر في الملف و الذي يجعل الأحرف التي توضع بعده تنزل على سطر جديد.

أهم باراميتر إختياري في هذه الدالة هو الباراميتر mode لأنه كما سبق و قلنا أن الحرف الذي نمرره مكانه يحدد الهدف من فتح الملف.


الجدول التالي يحتوي كل الحروف التي يمكن تمريرها مكان الباراميتر mode.

الحرف و معناه
'r' يعتبر إختصار للكلمة Read، و هو يستخدم لفتح الملف من أجل القراءة منه.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه.
شاهد مثال
'w' يعتبر إختصار للكلمة Write، و هو يستخدم لفتح الملف من أجل الكتابة فيه.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً، سيتم إنشاؤه.
ملاحظة: هذا الحرف يقوم بحذف النص الذي كان موجوداً في الملف في حال لم يكن فارغاَ.
شاهد مثال
'a' يعتبر إختصار للكلمة Append، و هو يستخدم لفتح الملف من أجل الكتابة في آخره، أي لإضافة نص جديد على النص الموجود في الملف.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً، سيتم إنشاؤه.
شاهد مثال
'x' يعتبر إختصار للكلمة Create، و هو يستخدم لإنشاء ملف جديد فقط في حال لم يكن موجوداً.
شاهد مثال
't' يعتبر إختصار للكلمة Text، و هو يستخدم لتحديد أن محتوى الملف عبارة عن نص عادي.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه.
شاهد مثال
'b' يعتبر إختصار للكلمة Binary، و هو يستخدم لتحديد أن محتوى الملف عبارة عن Binary، أي أحرف لا يمكن أن يفهمها الإنسان العادي.
هذا الـ Mode نستخدمه عند التعامل مع الملفات الغير نصية مثل الصور, الفيدوهات, التسجيلات الصوتية إلخ..
ملاحظة: المثال سيعلمك طريقة إنشاء نسخة من أي ملف.
شاهد مثال
'+' يعتبر إختصار للكلمتين Read & Write، و هو يستخدم لفتح الملف مع إمكانية القراءة منه و الكتابة فيه في نفس الوقت.
شاهد مثال

الأحرف المذكورة في الجدول السابق يمكن دمجها مع بعضها، أي يمكن تحديد أكثر من Mode في وقت واحد. فمثلاً يمكن كتابة 'wb' من أجل فتح ملف جديد بالإضافة إلى وضع نص فيه نوعه Binary كما نفعل في حال أردنا نسخ صورة.


في المثال التالي قمنا بإنشاء ملف نصي جديد إسمه demo.txt في نفس المشروع الذي نعمل فيه.
بعدها قمنا بكتابة السطر التالي بداخله 'Python is an easy language to learn.'.

مثال

Test.py
# لكي يتم إنشاء الملف و لنستطيع الكتابة فيه أيضاً 'w' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
opened_file = open('demo.txt', 'w')

# للكتابة في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
opened_file.write('Python is an easy language to learn.')

# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
opened_file.close()

النتيجة: إنشاء ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه و بداخله النص التالي.

Python is an easy language to learn.

دوال القراءة و الكتابة في الملفات

بعد فتح الملف الذي تريد التعامل معه بنجاح بواسطة الدالة open() يصبح بإمكانك استخدام الدوال التالية من الكائن الذي سترجعه هذه الدالة.

إسم الدالة مع تعريفها
1 write(string) تستخدم للكتابة في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
مكان الباراميتر string نمرر النص الذي نريد أن يتم كتابته في الملف.
شاهد مثال
2 writelines(lines) تستخدم لكتابة مجموعة نصوص مخزنة في list في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
مكان الباراميتر lines نمرر كائن list فيه مجموعة النصوص التي نريد أن يتم كتابتها بنفس الترتيب في الملف.
شاهد مثال
3 read(n = -1) تستخدم للقراءة من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
في حال تم استدعائها بدون تمرير أي عدد لها، سترجع كل النص الموجود في الملف دفعة واحد.
n هو باراميتر إختياري، مكانه يمكن تمرير عدد يمثل عدد الأحرف التي سيتم قراءتها من الملف حتى لا يتم قراءة كل محتواه دفعة واحدة. مع الإشارة إلى أنه في كل مرة يتم استدعاءها ترجع الأحرف التالية الموجودة في الملف.
شاهد مثال
4 readline(limits = -1) تستخدم للقراءة سطراً سطراً من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
في حال تم استدعائها بدون تمرير أي عدد لها، سترجع كل أحرف السطر التالي الموجود في الملف.
limits هو باراميتر إختياري، مكانه يمكن تمرير عدد يمثل عدد الأحرف التي سيتم قراءتها من السطر التالي في الملف حتى لا يتم قراءة كل محتوى السطر دفعة واحدة. مع الإشارة إلى أنه في كل مرة يتم استدعاءها ترجع الأحرف الموجودة حتى نهاية السطر الحالي في الملف.
شاهد مثال
5 readlines(limits = -1) تستخدم لإرجاع نسخة من النص الموجود في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها ككائن list.
كل عنصر في الكائن list الذي ترجعه يمثل سطر موجود في الملف.
في حال تم استدعائها بدون تمرير أي عدد لها، سيتم وضع كل الأحرف الموجودة في كل سطر في الملف كما هي في عنصر من عناصر الكائن list.
n هو باراميتر إختياري، مكانه يمكن تمرير عدد يمثل عدد الأحرف التي سيتم قراءتها من كل سطر في الملف في حال لم ترد أن تقرأ كل محتوى السطر.
شاهد مثال
6 tell() ترجع رقم فهرس آخر حرف في الملف تم الوصول إليه أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف.
شاهد مثال
7 seek(offset, from_what=0) أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف، يمكن إستخدام هذه الدالة للرجوع إلى الوراء في الملف لقراءة الملف من جديد على سبيل المثال.
from_what هو باراميتر إختياري، مكانه يمكن تمرير إحدى الأرقام التالية:
  • الرقم 0 للرجوع إلى أول حرف في الملف.
  • الرقم 1 للبقاء عند حرف الحالي الذي وصلت إليه في الملف.
  • الرقم 2 للذهاب إلى آخر حرف في الملف.
offset هو باراميتر إختياري، مكانه يمكن تمرير عدد يمثل بعد كم حرف نسبة للباراميتر from_what نريد البدء.
مثال: إذا قمت باستدعاء الدالة هكذا seek(0,0) أو هكذا seek(0) فهذا يعني أنك تريد العودة إلى أول حرف في الملف.
شاهد مثال
8 close() تستخدم لإغلاق الإتصال مع الملف و تنظيف الذاكرة من كل ما له علاقة بهذا الملف.
ملاحظة: في حال تم فتح الملف بالأساس بواسطة الجملة with فلا داعي لإغلاق الملف لأنها تقوم بإغلاقه بشكل تلقائي عنك.
شاهد مثال

خصائص الملفات

بالإضافة إلى الدوال السابقة، يصبح بإمكانك الإستفادة من الخصائص التالية من الكائن الذي ترجعه الدالة open().

إسم الخاصية مع تعريفها
1 name ترجع إسم الملف الذي يمثله الكائن.
2 mode ترجع الحرف أو الأحرف المستخدمة لتحديد الهدف من فتح الملف.
3 encoding ترجع إسم الترميز المستخدم في الملف الذي يمثله الكائن.
4 closed تستخدم لمعرفة ما إذا كان الكائن الذي يمثل الملف لا يزال متصل به أم أنه قد تم إغلاق الإتصال.
ترجع True إن كان كذلك، إن لم يكن كذلك ترجع False.

في المثال التالي قمنا بإنشاء كائن يشير للملف demo.txt الذي أنشأناه سابقاً.
بعدها قمنا بعرض خصائص هذا الكائن و التي بدورها تعتبر خصائص الملف نفسه.

مثال

Test.py
# 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
opened_file = open('demo.txt')

# الذي يشير للملف المفتوح في الذاكرة opened_file هنا قمنا بعرض كل خصائص الكائن
print('File Name:', opened_file.name)
print('Access Mode:', opened_file.mode)
print('Encoding Type:', opened_file.encoding)
print('Is File closed:', opened_file.closed)

# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
opened_file.close()

النتيجة

File Name: demo.txt
Access Mode: w
Encoding Type: cp1252
Is File closed: False

الموديول os

os هو موديول جاهز في بايثون يمكن من خلاله إعادة تسمية الملفات، مسح الملفات، إنشاء مجلدات، مسح مجلدات، التنقل بين المجلدات إلخ..
لإستخدام هذا الموديول يجب تضمينه كالتالي.

import os

الجدول التالي يحتوي على دوال الموديول os الأكثر استخداماً.

إسم الدالة مع تعريفها
1 os.rename(source, destination) تستخدم لتغيير إسم الملف.
مكان الباراميتر src نمرر مسار الملف الذي نريد تغيير إسمه.
مكان الباراميتر dst نمرر مسار الملف نفسه مع استبدال إسم الملف بالإسم الجديد الذي نريد إعطاؤه له.
شاهد مثال
2 os.remove(path) تستخدم لمسح الملف.
مكان الباراميتر path نمرر مسار الملف الذي نريد حذفه.
شاهد مثال
3 os.path.exists(path) تستخدم لمعرفة ما إن كان الملف موجوداً أم لا.
مكان الباراميتر path نمرر مسار الملف الذي نريد معرفة ما إن كان موجوداً أم لا.
ترجع True إذا كان الملف موجوداً. و ترجع False إن لم يكن كذلك.
شاهد مثال
4 os.mkdir(path) تستخدم لإنشاء مجلد جديد.
مكان الباراميتر path نمرر مسار المجلد الذي نريد إنشاؤه.
معلومة: إسم الدالة هو إختصار لجملة Make Directory.
شاهد مثال
5 os.rmdir(path) تستخدم لحذف المجلد في حال كان فارغاً، أي في حال لم يكن يحتوي على أي ملف بداخله.
مكان الباراميتر path نمرر مسار المجلد الذي نريد حذفه.
معلومة: إسم الدالة هو إختصار لجملة Remove Directory.
شاهد مثال
6 os.getcwd() تستخدم لمعرفة مسار المجلد الذي نقف بداخله حالياً.
معلومة: إسم الدالة هو إختصار لجملة Get Current Working Directory.
شاهد مثال

البلوك with

يمكن استخدام أسلوب البلوك with لإغلاق الملفات التي يتم فتحها بشكل تلقائي بدون الحاجة لإستدعاء الدالة close().
فيما يلي طريقة استخدامه:

with expression [as variable]:
    #with-block
  • expression: مكانه نضع الأمر الذي سيرجع كائن يشير الملف الذي تم فتحه في الذاكرة.
  • variable: مكانه نضع إسم الكائن الذي نريد من خلاله أن نتعامل مع الملف الذي تم فتحه في الذاكرة.
  • #with-block: مكان هذا التعليق نضع الأوامر التي نريد تنفيذها بعد أن تم فتح الملف بنجاح.

في المثال التالي قمنا بفتح ملف و قراءة النص الموجود فيه بدون الحاجة لإغلاقه عند الإنتهاء منه لأننا وضعنا الكود بداخل بلوك الكلمة with.

مثال

Test.py
# بعدها قمنا بطباعة النص الموجود فيه 'demo.txt' يشير للملف opened_file هنا قمنا بإنشاء كائن إسمه
with open('demo.txt', 'r') as opened_file:
    print(opened_file.read())

# هنا قمنا بطباعة ما إن كان الملف لا يزال مفتوحاً في الذاكرة أم أنه تم إغلاقه
print('Is File Closed:', opened_file.closed)

النتيجة: سيتم طباعة كل النص الموجود في الملف demo.txt الذي أنشأناه سابقاً في نفس المشروع الذي نعمل فيه.

Python is an easy language to learn.
Is File Closed: True

نلاحظ أن الدالة closed() أرجعت القيمة True و هذا يعني أنه تم إغلاق الملف من الذاكرة بشكل تلقائي عند إنتهاء البلوك with.

تخزين أحرف عربية في الملف

إذا حاولت كتابة أحرف عربية في ملف و لم تحدد أن نوع الترميز المستخدم عند التعامل مع الملف هو utf-8 فسيظهر أمامك الخطأ 'charmap' codec can't encode.
و إذا حاولت قراءة نص عربي موجود في ملف و لم تحدد نوع الترميز فستلاحظ أن النص يظهر بشكل غير مفهوم كالتالي السلام عليكم.


في المثال التالي قمنا بإنشاء ملف إسمه arabic.txt، ثم قمنا بتخزين نص عربي فيه، و بعدها قمنا بقراءة النص الموجود فيه.

مثال

Test.py
# 'Test.py' سيتم إنشاؤه في نفس المشروع بجانب الملف 'arabic.txt' يشير لملف جديد إسمه opened_file هنا قمنا بإنشاء كائن إسمه
# لنستطيع التعامل مع الأحرف العربية 'utf-8' حتى يتم إنشاء الملف و يكون لدينا القدرة على الكتابة و القراءة منه في نفس الوقت. كما أننا حددنا نوع الترميز هو 'w+' وضعنا الرمز
opened_file = open('arabic.txt', 'w+', encoding='utf-8')

# لكتابة نص جديد في الملف الذي يشير إليه و لاحظ أننا أدخلنا نص عربي  opened_file من الكائن write() هنا قمنا باستدعاء الدالة
opened_file.write('السلام عليكم و رحمة الله و بركاته')

# للعودة لأول الملف seek() هنا قمنا باستدعاء الدالة
opened_file.seek(0,0)

# الذي يشير للملف المفتوح حتى ترجع كل النص الموجود فيهK بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
print(opened_file.read())

# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
opened_file.close()

النتيجة: سيتم إنشاء الملف arabic.txt و تخزين النص العربي بداخله و من بعدها سيتم طباعة محتواه كما يلي.

السلام عليكم و رحمة الله و بركاته

التعامل مع الملفات بطريقة آمنة

عند التعامل مع الملفات قد تواجهك عدة مشاكل قد يكون سببها نظام التشغيل أو المستخدم.
لذلك عليك دائماً حماية الكود الذي من خلاله ستتعامل مع الملفات بالجمل try.. except التي شرحناها سابقاً.


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

  • مسار الملف غير صحيح - إذا كان مسار الملف الذي تريد التعامل معه مذكور بشكل غير صحيح.
  • الملف غير موجود - إذا كنت تحاول قراءة محتوى ملف غير موجود أصلاً أو تم مسحه.
  • ترميز الملف غير مناسب - إذا كنت تريد الكتابة بالعربية و لم تحدد أن نوع الترميز الذي يجب أن يستخدم هو 'utf-8'.
  • نوع الملف غير صحيح - إذا كنت تحاول التعامل مع صورة أو فيديو و لم تحدد أن نوع هذا الملف هو Binary كما شرحنا قبل قليل.
  • عدم إمتلاك صلاحية للتعامل مع الملف - إذا كان الملف عليه صلاحية القراءة فقط ( Read Only ) لا يمكنك تعديل النص الموجود فيه بأي شكل أو مسح الملف نفسه من الحاسوب.
  • صلاحيات المستخدم غير كافية - في حال كنت تريد إنشاء مجلد أو ملف و لم تكن تملك الصلاحيات التي تخولك لذلك. فمثلاً في نظام ويندوز لا تستطيع إنشاء ملف في المسار C:\ إذا لم تكن تملك صلاحيات مدير النظام.

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

المثال الأول

Test.py
# من أجل عرض النص الموجود فيه 'harmash.txt' هنا حاولنا إيجاد و فتح ملف إسمه
try:
    opened_file = open('harmash.txt', 'r')
    print(opened_file.read())
    opened_file.close()

# و من ثم عرضها كنص عادي ex بما أنه لا يوجد هكذا ملف في المشروع, سيتم تخزين معلومات الخطأ الذي حدث في الكائن
except Exception as ex:
    print(ex)
    
print('Program still work properly')

النتيجة: سيتم طباعة المشكلة التي حدثت أثناء محاولة القراءة من الملف كنص عادي و لن يؤدي ذلك إلى تعليق البرنامج.

[Errno 2] No such file or directory: 'harmash.txt'
Program still work properly

هنا قمنا بإعادة المثال السابق لكننا هذه المرة حاولنا فتح الملف بوسطة البلوك with.
لاحظ أن النتيجة هي نفسها في الحالتين.

المثال الثاني

Test.py
# من أجل عرض النص الموجود فيه 'harmash.txt' هنا حاولنا إيجاد و فتح ملف إسمه
try:
    with open('harmash.txt', 'r') as opened_file:
        print(opened_file.read())

# و من ثم عرضها كنص عادي ex بما أنه لا يوجد هكذا ملف في المشروع، سيتم تخزين معلومات الخطأ الذي حدث في الكائن
except Exception as ex:
    print(ex)
    
print('Program still work properly')

النتيجة: سيتم طباعة المشكلة التي حدثت أثناء محاولة القراءة من الملف كنص عادي و لن يؤدي ذلك إلى تعليق البرنامج.

[Errno 2] No such file or directory: 'harmash.txt'
Program still work properly