أساسيات بايثون 22: شرح التعامل مع الملفات في Python للمبتدئين

شرح التعامل مع الملفات في Python للمبتدئين ضمن كورس أساسيات بايثون من بايثون العرب

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

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

حتى الآن ربما كتبت برامج تطبع النتائج على الشاشة فقط باستخدام print()، لكن ماذا لو أردت حفظ هذه النتائج داخل ملف؟ ماذا لو أردت قراءة أسماء من ملف نصي؟ ماذا لو أردت أن يسجل برنامجك ملاحظات أو درجات أو بيانات بسيطة لا تضيع بعد إغلاق البرنامج؟

هنا يأتي دور التعامل مع الملفات. في هذا المقال ستتعلم كيف تفتح ملفًا باستخدام open()، وكيف تقرأ محتواه، وكيف تكتب داخله، وما الفرق بين أوضاع الفتح مثل r و w و a، ولماذا نستخدم with عند التعامل مع الملفات.

الخلاصة السريعة: التعامل مع الملفات في Python يسمح لك بقراءة البيانات من ملفات خارجية أو حفظ نتائج برنامجك داخل ملفات نصية. {alertInfo}

ما المقصود بالتعامل مع الملفات في Python؟

التعامل مع الملفات يعني أن برنامج بايثون يستطيع فتح ملف موجود على جهازك، قراءة محتواه، كتابة بيانات جديدة داخله، أو إضافة بيانات في نهايته.

أبسط مثال على ذلك: لديك ملف اسمه notes.txt يحتوي على ملاحظات، وتريد أن يقرأه برنامجك ويطبع محتواه على الشاشة.

أو تريد أن يطلب البرنامج من المستخدم إدخال اسمه، ثم يحفظ الاسم داخل ملف بدل أن يختفي بعد انتهاء تشغيل البرنامج.

التعامل مع الملفات مهم في مشاريع كثيرة، مثل:

  • حفظ نتائج برنامج بسيط.
  • قراءة بيانات من ملف نصي.
  • إنشاء سجل للعمليات أو الأخطاء.
  • حفظ قائمة أسماء أو مهام.
  • بناء مشاريع تدريبية تعتمد على ملفات .txt.

شرح فكرة فتح ملف في Python باستخدام open وكيف يتعامل البرنامج مع الملفات النصية

فتح ملف في Python باستخدام open

الدالة الأساسية للتعامل مع الملفات في بايثون هي open(). من خلالها نحدد اسم الملف، وطريقة فتحه.

الشكل العام:

file = open("filename.txt", "mode")

حيث:

  • filename.txt: اسم الملف الذي تريد فتحه.
  • mode: وضع الفتح، هل تريد قراءة الملف أم الكتابة داخله أم الإضافة عليه.

مثال:

file = open("notes.txt", "r")

هنا طلبنا من بايثون فتح ملف اسمه notes.txt بوضع القراءة r.

ملاحظة مهمة: إذا فتحت ملفًا باستخدام open() بالطريقة التقليدية، يجب أن تغلقه بعد الانتهاء باستخدام close(). {alertWarning}

إغلاق الملف باستخدام close

عند فتح ملف، من الأفضل إغلاقه بعد الانتهاء حتى لا يبقى الملف مفتوحًا في الذاكرة.

file = open("notes.txt", "r")

# هنا نستخدم الملف

file.close()

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

قراءة ملف نصي باستخدام read

لنفترض أن لديك ملفًا اسمه notes.txt ومحتواه:

Welcome to Python
Learning files is important

يمكنك قراءة محتوى الملف بهذا الشكل:

file = open("notes.txt", "r")

content = file.read()

print(content)

file.close()

الناتج سيكون محتوى الملف كاملًا:

Welcome to Python
Learning files is important

الدالة read() تقرأ محتوى الملف كاملًا كنص واحد.


مثال قراءة ملف نصي في Python باستخدام read و with للمبتدئين

استخدام with عند التعامل مع الملفات

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

with open("notes.txt", "r") as file:
    content = file.read()
    print(content)

لاحظ أننا لم نكتب file.close()، لأن with تتكفل بإغلاق الملف تلقائيًا.

الأفضل للمبتدئين: استخدم with open(...) عند قراءة أو كتابة الملفات، لأنها أوضح وأكثر أمانًا. {alertSuccess}

قراءة الملف سطرًا سطرًا باستخدام readline

إذا كنت تريد قراءة سطر واحد فقط من الملف، يمكنك استخدام readline().

with open("notes.txt", "r") as file:
    line = file.readline()
    print(line)

هذا الكود يقرأ السطر الأول فقط من الملف.

ولو كتبت readline() مرة أخرى، سيقرأ السطر التالي:

with open("notes.txt", "r") as file:
    first_line = file.readline()
    second_line = file.readline()

    print(first_line)
    print(second_line)

قراءة كل الأسطر باستخدام readlines

الدالة readlines() تقرأ كل أسطر الملف وتضعها داخل قائمة List.

with open("notes.txt", "r") as file:
    lines = file.readlines()

print(lines)

قد تكون النتيجة مثل:

['Welcome to Python\n', 'Learning files is important']

لاحظ وجود \n في نهاية السطر الأول. هذا الرمز يعني سطرًا جديدًا.

قراءة الملف باستخدام for loop

من الطرق العملية والمفيدة قراءة الملف سطرًا سطرًا باستخدام حلقة for.

with open("notes.txt", "r") as file:
    for line in file:
        print(line)

هذه الطريقة ممتازة عندما يكون الملف كبيرًا، لأن البرنامج يتعامل مع كل سطر بالتدريج بدل قراءة الملف كله مرة واحدة.

كتابة نص داخل ملف باستخدام write

للكتابة داخل ملف، نستخدم وضع الفتح w، ثم نستخدم الدالة write().

with open("output.txt", "w") as file:
    file.write("Hello Python")

هذا الكود ينشئ ملفًا اسمه output.txt إذا لم يكن موجودًا، ثم يكتب داخله النص:

Hello Python
انتبه: وضع الكتابة w يمسح محتوى الملف القديم إذا كان الملف موجودًا، ثم يكتب المحتوى الجديد. {alertWarning}

مثال كتابة نص داخل ملف في Python باستخدام write مع توضيح الفرق بين w و a

كتابة أكثر من سطر داخل الملف

إذا أردت كتابة أكثر من سطر، استخدم الرمز \n لإنشاء سطر جديد.

with open("output.txt", "w") as file:
    file.write("First line\n")
    file.write("Second line\n")
    file.write("Third line")

سيصبح محتوى الملف:

First line
Second line
Third line

إضافة نص إلى نهاية الملف باستخدام a

إذا أردت إضافة محتوى جديد في نهاية الملف بدون حذف المحتوى القديم، استخدم وضع الإضافة a.

with open("output.txt", "a") as file:
    file.write("\nNew line added")

هنا لن يتم حذف النص القديم، بل سيتم إضافة السطر الجديد في آخر الملف.

قاعدة سهلة: استخدم w للكتابة من الصفر، واستخدم a للإضافة على ملف موجود بدون حذف محتواه. {alertSuccess}

الفرق بين r و w و a في فتح الملفات

الوضع المعنى ماذا يحدث؟ متى تستخدمه؟
r Read يفتح الملف للقراءة فقط عندما تريد قراءة محتوى ملف موجود
w Write ينشئ ملفًا جديدًا أو يمسح محتوى الملف الموجود عندما تريد كتابة محتوى جديد من البداية
a Append يضيف المحتوى في نهاية الملف عندما تريد الإضافة بدون حذف القديم
x Create ينشئ ملفًا جديدًا ويعطي خطأ إذا كان الملف موجودًا عندما تريد التأكد أن الملف لا يوجد مسبقًا

ملخص أوضاع فتح الملفات في Python مثل r و w و a و x للمبتدئين

مثال عملي: حفظ أسماء الطلاب في ملف

لنكتب برنامجًا بسيطًا يطلب من المستخدم إدخال اسم طالب، ثم يحفظه داخل ملف.

student_name = input("Enter student name: ")

with open("students.txt", "a") as file:
    file.write(student_name + "\n")

print("Student saved successfully")

استخدمنا هنا الوضع a حتى نضيف كل اسم جديد في نهاية الملف بدون حذف الأسماء السابقة.

مثال عملي: قراءة أسماء الطلاب من ملف

بعد حفظ الأسماء في ملف students.txt، يمكننا قراءة الأسماء وطباعتها:

with open("students.txt", "r") as file:
    for student in file:
        print(student.strip())

استخدمنا strip() لإزالة السطر الجديد \n والمسافات الزائدة من بداية ونهاية كل اسم.

لماذا استخدمنا strip عند القراءة؟

عند قراءة الأسطر من ملف، غالبًا يحتوي كل سطر على رمز نهاية السطر \n. لذلك قد تظهر مسافة أو سطر فارغ عند الطباعة.

مثال:

name = "Ahmed\n"

print(name)
print(name.strip())

الدالة strip() تنظف النص من المسافات الزائدة وبدايات ونهايات الأسطر، وهي مفيدة جدًا عند قراءة البيانات من ملفات.

ماذا يحدث إذا كان الملف غير موجود؟

إذا حاولت فتح ملف غير موجود بوضع القراءة r، سيظهر خطأ لأن بايثون لا تستطيع قراءة ملف غير موجود.

with open("missing.txt", "r") as file:
    print(file.read())

سيظهر خطأ يشبه:

FileNotFoundError: [Errno 2] No such file or directory: 'missing.txt'

لا تقلق من هذا الخطأ الآن، لأننا سنتعلم في درس قادم كيف نتعامل مع الأخطاء باستخدام try و except.

معلومة مهمة: وضع r يحتاج أن يكون الملف موجودًا، بينما وضع w و a يمكن أن ينشئا الملف إذا لم يكن موجودًا. {alertInfo}

استخدام encoding مع الملفات العربية

عند التعامل مع نصوص عربية، من الأفضل تحديد الترميز encoding="utf-8" حتى تظهر الحروف العربية بشكل صحيح.

with open("arabic.txt", "w", encoding="utf-8") as file:
    file.write("مرحبًا بك في بايثون العرب")

ولقراءة الملف:

with open("arabic.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
نصيحة مهمة: عند كتابة أو قراءة ملفات تحتوي على اللغة العربية، استخدم encoding="utf-8" لتجنب مشاكل ظهور الحروف. {alertSuccess}

مثال كامل: برنامج ملاحظات بسيط

الآن لنكتب برنامجًا بسيطًا يسمح للمستخدم بكتابة ملاحظة، ثم يحفظها داخل ملف.

note = input("اكتب ملاحظتك: ")

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write(note + "\n")

print("تم حفظ الملاحظة بنجاح")

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

مثال كامل: عرض كل الملاحظات

بعد حفظ الملاحظات داخل notes.txt، يمكننا عرضها بهذا الشكل:

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

print("الملاحظات المحفوظة:")
print(notes)

بهذا تكون كتبت أول مشروع صغير يتعامل مع الملفات في بايثون.

أخطاء شائعة عند التعامل مع الملفات

1. نسيان إغلاق الملف

إذا استخدمت open() بدون with، قد تنسى كتابة close(). لذلك الأفضل استخدام with.

# الأفضل
with open("file.txt", "r") as file:
    content = file.read()

2. استخدام w بالخطأ بدل a

إذا استخدمت w مع ملف موجود، سيتم حذف محتواه القديم. إذا كنت تريد الإضافة فقط، استخدم a.

# يمسح المحتوى القديم
open("notes.txt", "w")

# يضيف في النهاية بدون حذف القديم
open("notes.txt", "a")

3. محاولة قراءة ملف غير موجود

وضع r يحتاج ملفًا موجودًا. إذا لم يكن الملف موجودًا سيظهر FileNotFoundError.

4. نسيان encoding مع اللغة العربية

عند التعامل مع العربية، استخدم:

encoding="utf-8"

خصوصًا عند القراءة والكتابة في ملفات تحتوي على نص عربي.

جدول سريع لأهم أوامر الملفات

الأمر وظيفته مثال
open() فتح ملف open("file.txt", "r")
read() قراءة الملف كاملًا file.read()
readline() قراءة سطر واحد file.readline()
readlines() قراءة الأسطر داخل قائمة file.readlines()
write() كتابة نص داخل الملف file.write("Hello")
close() إغلاق الملف file.close()

متى تستخدم read ومتى تستخدم for loop؟

استخدم read() عندما يكون الملف صغيرًا وتريد قراءة محتواه كاملًا مرة واحدة.

أما إذا كان الملف يحتوي على أسطر كثيرة، فاستخدام for line in file قد يكون أفضل، لأنه يتعامل مع الملف سطرًا سطرًا.

الحالة الطريقة المناسبة
ملف صغير وتريد محتواه كاملًا read()
تريد أول سطر فقط readline()
تريد قائمة بكل الأسطر readlines()
ملف كبير أو تريد معالجة كل سطر for line in file

تمرين بسيط على التعامل مع الملفات

اكتب برنامجًا يطلب من المستخدم إدخال ثلاث مهام يومية، ثم يحفظها داخل ملف اسمه tasks.txt.

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

ابدأ بهذا الكود:

with open("tasks.txt", "w", encoding="utf-8") as file:
    for i in range(3):
        task = input("اكتب مهمة: ")
        file.write(task + "\n")

with open("tasks.txt", "r", encoding="utf-8") as file:
    print("المهام المحفوظة:")
    print(file.read())

هذا التمرين بسيط، لكنه يجمع بين input() و for loop وكتابة الملفات وقراءتها.

روابط مفيدة

الخلاصة

في هذا الدرس تعلمت أساسيات التعامل مع الملفات في Python. عرفت كيف تفتح ملفًا باستخدام open()، وكيف تقرأ محتواه باستخدام read() و readline() و readlines()، وكيف تكتب داخله باستخدام write().

تعلمت أيضًا الفرق بين أوضاع الفتح المهمة:

  • r لقراءة ملف موجود.
  • w للكتابة مع حذف المحتوى القديم.
  • a للإضافة في نهاية الملف بدون حذف القديم.
  • x لإنشاء ملف جديد فقط إذا لم يكن موجودًا.

وتعلمت أن استخدام with هو الطريقة الأفضل، لأنها تغلق الملف تلقائيًا بعد الانتهاء. كما عرفت أهمية استخدام encoding="utf-8" عند التعامل مع نصوص عربية.

الخلاصة السريعة: استخدم with open() لقراءة وكتابة الملفات، واختر وضع الفتح المناسب: r للقراءة، w للكتابة، و a للإضافة. {alertSuccess}

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

ما وظيفة open في Python؟

الدالة open() تستخدم لفتح ملف في بايثون، سواء لقراءته أو الكتابة داخله أو الإضافة عليه.

ما الفرق بين r و w و a في فتح الملفات؟

r للقراءة، و w للكتابة من البداية مع حذف المحتوى القديم، و a للإضافة في نهاية الملف بدون حذف المحتوى السابق.

لماذا نستخدم with عند فتح الملفات؟

نستخدم with لأنها تغلق الملف تلقائيًا بعد الانتهاء، وتجعل الكود أنظف وأكثر أمانًا.

هل write تضيف سطرًا جديدًا تلقائيًا؟

لا. الدالة write() لا تضيف سطرًا جديدًا تلقائيًا. إذا أردت سطرًا جديدًا، أضف \n بنفسك.

لماذا تظهر مشكلة في الحروف العربية عند قراءة الملف؟

قد يحدث ذلك بسبب الترميز. استخدم encoding="utf-8" عند فتح الملف للقراءة أو الكتابة حتى تظهر الحروف العربية بشكل صحيح.

ماذا يحدث إذا قرأت ملفًا غير موجود؟

إذا استخدمت وضع القراءة r مع ملف غير موجود، سيظهر خطأ FileNotFoundError. سنتعلم التعامل معه في درس الأخطاء القادم.

إرسال تعليق

أحدث أقدم