Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 10

التعامل مع الملفات النصية وJSON

Recommended resources

أهلاً بك في الدرس الثاني من وحدة "العمل مع البيانات وواجهات برمجة التطبيقات (APIs)".

في الدرس السابق، تعلمنا كيفية توسيع قدرات بايثون عبر تثبيت واستيراد المكتبات الخارجية باستخدام pip. هذه المهارة فتحت لنا الباب لاستخدام أكواد جاهزة وقوية كتبها مبرمجون آخرون.

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

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

1. التعامل مع الملفات النصية (Text Files)

الملفات النصية (مثل ملفات .txt أو حتى ملفات كود البايثون .py) هي أبسط أشكال تخزين البيانات. إنها تحتوي على نصوص عادية يمكنك قراءتها وتعديلها بأي محرر نصوص.

لماذا نحتاج إلى التعامل مع الملفات؟

التعامل مع الملفات في بايثون - الجزء 1 | Text File

يقدم هذا الفيديو من قناة Two Pi مقدمة ممتازة تشرح أهمية الملفات كوسيلة لتخزين البيانات بشكل دائم وتبادلها بين البرامج. مشاهدة هذا المقطع ستمنحك السياق اللازم لفهم ما سنقوم به.

شاهد المقطع من البداية حتى الدقيقة 01:47. ركز على فهم فكرة أن الملفات تتيح لنا الحفاظ على البيانات بعد إغلاق البرنامج.

الطريقة الصحيحة لفتح الملفات: with open()

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

with open('example.txt', 'w') as file:
    # سنتعامل مع الملف هنا
    file.write('This is the first line.')

# بمجرد الخروج من كتلة 'with'، يتم إغلاق الملف 'file' تلقائياً.

open() هي الدالة المدمجة التي نستخدمها لفتح ملف. تأخذ وسيطين أساسيين:

  1. اسم الملف: سلسلة نصية تحتوي على اسم الملف ومساره (إذا لم يكن في نفس المجلد).
  2. الوضع (Mode): حرف يحدد ما نريد أن نفعله بالملف ('r' للقراءة، 'w' للكتابة، 'a' للإضافة).

لفهم هذه العملية بشكل أفضل، شاهد كيف يقدم الفيديو طريقة with كأفضل ممارسة.

التعامل مع الملفات في بايثون - الجزء 1 | Text File

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

شاهد المقطع من الدقيقة 13:17 إلى 14:38. ركز على: بنية with open(...) as ...:. فكرة أن الملف يتم إغلاقه تلقائياً عند انتهاء كتلة with.

القراءة من الملفات النصية

للقراءة من ملف، نستخدم الوضع 'r' (Read)، وهو الوضع الافتراضي إذا لم نحدده.

لنفترض أن لدينا ملفاً اسمه greeting.txt يحتوي على النص التالي:

Hello from Python!
Welcome to file handling.

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

try:
    with open('greeting.txt', 'r', encoding='utf-8') as f:
        content = f.read()
        print("المحتوى الكامل للملف:")
        print(content)
except FileNotFoundError:
    print("خطأ: الملف 'greeting.txt' غير موجود.")

# ملاحظة: استخدام encoding='utf-8' هو ممارسة جيدة لضمان التعامل الصحيح مع النصوص العربية والأحرف الخاصة.

أو يمكننا قراءة الملف سطراً بسطر ووضع الأسطر في قائمة باستخدام .readlines():

try:
    with open('greeting.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines()
        print("\nقائمة أسطر الملف:")
        print(lines)

        # يمكننا الآن المرور على الأسطر
        for line in lines:
            # .strip() تزيل أي مسافات فارغة أو أسطر جديدة في بداية ونهاية السطر
            print(f"سطر: {line.strip()}")
except FileNotFoundError:
    print("خطأ: الملف 'greeting.txt' غير موجود.")

الكتابة إلى الملفات النصية

للكتابة، لدينا وضعان رئيسيان:

  • الوضع 'w' (Write): يقوم بإنشاء ملف جديد للكتابة فيه. تحذير: إذا كان الملف موجوداً بالفعل، فسيتم مسح محتواه بالكامل والبدء من جديد.
  • الوضع 'a' (Append): يقوم بإضافة المحتوى الجديد إلى نهاية الملف دون مسح محتواه الحالي. إذا لم يكن الملف موجوداً، فسيتم إنشاؤه.

لنقم بإنشاء ملف جديد ونكتب فيه:

# قائمة بأسماء المستخدمين
users = ['أحمد', 'فاطمة', 'علي']

with open('users.txt', 'w', encoding='utf-8') as f:
    f.write("قائمة المستخدمين:\n")
    for user in users:
        # يجب إضافة محرف السطر الجديد \n يدوياً
        f.write(f"- {user}\n")

print("تم إنشاء ملف 'users.txt' وكتابة البيانات فيه.")

افتح ملف users.txt الذي تم إنشاؤه وسترى المحتوى الذي كتبناه.

الآن، لنجرب إضافة مستخدم جديد باستخدام الوضع 'a':

with open('users.txt', 'a', encoding='utf-8') as f:
    f.write("- مريم\n")

print("تمت إضافة مستخدم جديد إلى 'users.txt'.")

افتح الملف مرة أخرى، وستجد أن "مريم" قد أُضيفت في النهاية.

التعامل مع الملفات في بايثون - الجزء 1 | Text File

يلخص هذا الفيديو بشكل ممتاز أوضاع فتح الملفات المختلفة وعمليات القراءة والكتابة.

يمكنك الرجوع إلى هذه المقاطع من الفيديو إذا احتجت إلى توضيح إضافي: للقراءة: شاهد من 03:21 إلى 08:12 (لا تقلق بشأن دالة tell() حالياً). لأوضاع الفتح: شاهد من 08:12 إلى 09:40. للكتابة: شاهد من 09:40 إلى 12:33.

اختبر فهمك! لديك ملف اسمه `tasks.txt` يحتوي على قائمة مهام: ```text Task 1: Learn Python Task 2: Practice coding Task 3: Build a project ``` مهمتك هي كتابة برنامج يقرأ هذا الملف، ويضيف كلمة "Completed: " في بداية كل سطر، ثم يكتب النتيجة في ملف جديد اسمه `completed_tasks.txt`.
أظهر الحل
# أنشئ الملف الأصلي أولاً إذا لم يكن موجوداً
with open('tasks.txt', 'w', encoding='utf-8') as f:
    f.write("Task 1: Learn Python\n")
    f.write("Task 2: Practice coding\n")
    f.write("Task 3: Build a project\n")

try:
    # افتح ملف المهام للقراءة
    with open('tasks.txt', 'r', encoding='utf-8') as original_file:
        tasks = original_file.readlines()

    # افتح الملف الجديد للكتابة
    with open('completed_tasks.txt', 'w', encoding='utf-8') as completed_file:
        for task in tasks:
            # قم بإزالة أي مسافات أو أسطر جديدة غير مرغوب فيها
            clean_task = task.strip()
            # اكتب السطر الجديد في الملف الجديد
            completed_file.write(f"Completed: {clean_task}\n")
    
    print("تم إنشاء ملف 'completed_tasks.txt' بنجاح.")

except FileNotFoundError:
    print("تأكد من وجود ملف 'tasks.txt' في نفس المجلد.")


2. التعامل مع ملفات JSON

Python and JSON File Interaction
هذه الصورة توضح ببساطة العلاقة بين بايثون وملفات JSON، حيث يمكن لبرامجنا قراءة هذه الملفات ومعالجتها بسهولة.

ما هو JSON؟

JSON (JavaScript Object Notation) هو تنسيق معياري خفيف لتبادل البيانات. على الرغم من أن اسمه مشتق من JavaScript، إلا أنه مستقل تماماً وتستخدمه كل لغات البرمجة تقريباً.

فكر في JSON على أنه طريقة منظمة لكتابة البيانات تشبه إلى حد كبير قواميس بايثون (Dictionaries). يستخدم بنية "مفتاح-قيمة" (key-value).

هذا مثال على بيانات طالب بصيغة JSON:

{
    "name": "سارة",
    "age": 22,
    "is_student": true,
    "courses": ["الرياضيات", "الفيزياء"]
}

هذا الهيكل مألوف جداً، أليس كذلك؟ إنه مطابق تقريباً لكيفية كتابة قاموس في بايثون. هذه السهولة في التحويل بين JSON وقواميس بايثون هي ما يجعله قوياً ومستخدماً على نطاق واسع، خاصة في واجهات برمجة التطبيقات (APIs) التي سنتحدث عنها قريباً.

استخدام وحدة json في بايثون

بايثون تأتي مع وحدة مدمجة اسمها json تجعل التعامل مع هذا التنسيق سهلاً للغاية. بما أنها مدمجة، لا نحتاج لتثبيتها باستخدام pip. كل ما علينا فعله هو استيرادها: import json.

دليل JSON وبايثون: قراءة وكتابة ومعالجة البيانات

تقدم هذه المقالة من DigiBeatrix شرحاً مبسطاً ومباشراً لكيفية قراءة وكتابة ملفات JSON باستخدام بايثون. سنركز على الأجزاء الأساسية.

اقرأ الأقسام التالية للحصول على فهم شامل: 1. ما هو JSON؟: لفهم نظرة عامة على JSON وهيكله. 2.2 كيفية قراءة ملفات JSON: لفهم كيفية استخدام json.load(). 7.1 الكتابة إلى ملف JSON: لفهم كيفية استخدام json.dump().

قراءة ملف JSON

لتحويل بيانات من ملف JSON إلى قاموس بايثون، نستخدم دالة json.load() (لاحظ أنها load بدون s).

لنفترض أن لدينا ملف data.json يحتوي على بيانات الطالب السابقة.

import json

try:
    with open('data.json', 'r', encoding='utf-8') as f:
        # json.load() تقرأ الملف وتحوله إلى قاموس بايثون
        student_data = json.load(f)

    # الآن student_data هو قاموس عادي
    print(type(student_data))
    print(f"اسم الطالب: {student_data['name']}")
    print(f"المادة الثانية: {student_data['courses'][1]}")

except FileNotFoundError:
    print("الملف 'data.json' غير موجود.")
except json.JSONDecodeError:
    print("خطأ في تنسيق ملف JSON.")

كتابة ملف JSON

لتحويل قاموس بايثون وحفظه في ملف بصيغة JSON، نستخدم دالة json.dump() (لاحظ أنها dump بدون s).

import json

# لنقم بإنشاء قاموس بايثون جديد
new_product = {
    "product_id": 105,
    "name": "شاحن محمول",
    "price": 99.99,
    "in_stock": True,
    "tags": ["إلكترونيات", "ملحقات"]
}

with open('product.json', 'w', encoding='utf-8') as f:
    # json.dump() تكتب القاموس في الملف بصيغة JSON
    # indent=4 تجعل الملف منظماً وسهل القراءة
    # ensure_ascii=False تضمن كتابة الأحرف العربية بشكل صحيح
    json.dump(new_product, f, indent=4, ensure_ascii=False)

print("تم إنشاء ملف 'product.json' بنجاح.")

افتح ملف product.json الذي تم إنشاؤه. ستلاحظ كيف أن indent=4 جعلت تنسيقه جميلاً ومنظماً، مما يسهل قراءته كإنسان.

اختبر فهمك! قم بإنشاء برنامج بايثون يقوم بالتالي: 1. ينشئ قاموساً يحتوي على معلوماتك الشخصية (مثل `name`, `city`, `hobby`). 2. يحفظ هذا القاموس في ملف يسمى `profile.json` بتنسيق منظم وجميل.
أظهر الحل
import json

# 1. إنشاء قاموس بالمعلومات الشخصية
my_profile = {
    "name": "اسمك",  # استبدل هذا باسمك
    "city": "مدينتك", # استبدل هذا بمدينتك
    "hobby": "هوايتك المفضلة" # استبدل هذا بهوايتك
}

# 2. حفظ القاموس في ملف JSON
with open('profile.json', 'w', encoding='utf-8') as f:
    json.dump(my_profile, f, indent=4, ensure_ascii=False)

print("تم إنشاء ملف 'profile.json' بنجاح!")

ملخص الدرس

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

أهم النقاط التي تعلمناها:

  • نستخدم عبارة with open(...) للتعامل الآمن مع الملفات.
  • الأوضاع الأساسية لفتح الملفات هي: 'r' (للقراءة)، 'w' (للكتابة مع المسح)، و'a' (للإضافة في النهاية).
  • للملفات النصية، نستخدم .read() أو .readlines() للقراءة، و.write() للكتابة.
  • JSON هو تنسيق بيانات يشبه قواميس بايثون ويستخدم على نطاق واسع لتبادل البيانات.
  • نستخدم وحدة json المدمجة: json.load() للقراءة من ملف JSON، و json.dump() للكتابة إليه.

ما التالي؟

الآن بعد أن أصبحنا قادرين على التعامل مع ملفات JSON، نحن على أتم الاستعداد للخطوة التالية والمثيرة: فهم مفهوم واجهات برمجة التطبيقات (APIs). في الدرس القادم، سنكتشف كيف تستخدم الخدمات على الإنترنت (مثل خدمات الطقس، الخرائط، أو حتى نماذج اللغة الكبيرة) واجهات API للتواصل، وكيف أن هذه الواجهات "تتحدث" غالباً بلغة JSON التي أتقناها للتو.