جاري تحميل المحتوى...
تعلمت في الفصول السابقة أن المتغيرات تستطيع الاحتفاظ بالقيم أثناء تنفيذ البرنامج. لكن عند انتهاء البرنامج نحتاج أحيانًا إلى حفظ بعض البيانات حتى يمكن الرجوع إليها لاحقًا. في هذا الفصل ستتعلم الأساسيات اللازمة لقراءة النصوص من الملفات وكتابة النصوص فيها باستخدام Python.
المتغير يحتفظ بالقيمة أثناء عمل البرنامج. أما الملف فيسمح بحفظ بيانات خارج المتغيرات حتى يمكن فتحها وقراءتها في وقت لاحق.
يمكن مثلًا حفظ:
سنركز في هذا الفصل على الملفات النصية فقط، ولن ندخل في قواعد البيانات أو الملفات الثنائية.
Text File هو ملف يحتوي نصًا يمكن قراءته وكتابته على شكل أحرف وأسطر.
قد يحتوي ملف باسم notes.txt مثلًا على:
Ali
Sara
Omar
هذه الأسطر تصبح بيانات يمكن لبرنامج Python قراءتها ومعالجتها.
open()يمكن فتح ملف باستخدام open().
file = open("notes.txt", "r", encoding="utf-8")
في هذا المثال:
"notes.txt" هو اسم الملف أو المسار المستخدم."r" هو File Mode.encoding="utf-8" يحدد Encoding المستخدم لقراءة النص.سنفترض عند استخدام وضع القراءة في أمثلة الفصل أن الملف المطلوب موجود بالفعل.
بعد فهم الصيغة الأساسية سنستخدم غالبًا with open(...) لأنها الطريقة الأساسية في أمثلة هذا الفصل.
سنستخدم ثلاثة أوضاع فقط:
| Mode | الاستخدام الأساسي |
|---|---|
"r" |
قراءة ملف موجود |
"w" |
الكتابة، ويبدأ محتوى الملف من جديد عند استخدامه مع ملف موجود في أمثلةنا |
"a" |
إضافة محتوى جديد في نهاية الملف |
"r"with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
يستخدم "r" لقراءة المحتوى.
"w"with open("notes.txt", "w", encoding="utf-8") as file:
file.write("Hello")
في الحالة المبسطة التي ندرسها، إذا كان الملف يحتوي محتوى سابقًا فإن فتحه باستخدام "w" يبدأ محتواه من جديد، ثم تكتب البيانات الجديدة.
"a"with open("notes.txt", "a", encoding="utf-8") as file:
file.write("Omar\n")
يضيف "a" المحتوى الجديد في نهاية الملف بدل استبدال المحتوى السابق.
مهم: وضع "a" لا يضيف سطرًا جديدًا تلقائيًا. إذا أردت الانتقال إلى سطر جديد فعليك تضمين \n في النص عند الحاجة.
with open()سنستخدم with في معظم الأمثلة:
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
يتم فتح الملف داخل كتلة with، ويستخدم المتغير file للتعامل معه.
عند انتهاء كتلة with يتم التعامل مع إغلاق الملف تلقائيًا، لذلك لا نحتاج في هذه الأمثلة إلى استدعاء عملية إغلاق يدويًا.
لا نحتاج هنا إلى دراسة Context Managers من الداخل؛ يكفي استخدام الصيغة بصورة صحيحة.
read()تقرأ read() محتوى الملف النصي كاملًا وتعيده في صورة String.
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
إذا كان notes.txt يحتوي:
Ali
Sara
فإن المتغير content يحتوي النص المقروء من الملف.
مهم: في هذا الاستخدام تعيد read() قيمة من نوع str، وليست List.
readline()تستخدم readline() لقراءة السطر التالي المتاح.
with open("notes.txt", "r", encoding="utf-8") as file:
first_line = file.readline()
print(first_line)
إذا كان الملف يبدأ بالسطر Ali فإن الاستدعاء الأول لـreadline() يقرأ هذا السطر.
وإذا استدعيت readline() مرة أخرى، تنتقل القراءة إلى السطر التالي المتاح.
لا نقول إن readline() تقرأ الملف كاملًا في استدعاء واحد.
يمكن استخدام حلقة for للمرور على أسطر الملف.
with open("notes.txt", "r", encoding="utf-8") as file:
for line in file:
print(line)
تنفذ الحلقة مرة لكل سطر مقروء.
قد يحتوي السطر المقروء على محرف الانتقال إلى سطر جديد في نهايته، لذلك قد يكون استخدام strip() مفيدًا عند العرض أو المعالجة.
strip() مع الأسطرwith open("notes.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip())
تعلمت strip() مع النصوص سابقًا. هنا نستخدمها لإزالة المحارف البيضاء المحيطة بالسطر عند الحاجة.
write()تستخدم write() لكتابة String داخل الملف.
with open("notes.txt", "w", encoding="utf-8") as file:
file.write("Hello")
النص "Hello" هو النص الذي تتم كتابته.
في هذا الفصل نستخدم write() مع Strings بسيطة، ولا نحتاج إلى تفاصيل متقدمة عن عملية الكتابة.
\nلا تنتقل write() تلقائيًا إلى سطر جديد بعد كل استدعاء. يمكن تضمين \n داخل النص.
with open("notes.txt", "w", encoding="utf-8") as file:
file.write("Ali\n")
file.write("Sara\n")
يصبح المحتوى على سطرين:
Ali
Sara
وجود \n بعد Ali هو الذي ينقل الكتابة التالية إلى سطر جديد.
"w"لنفترض أن الملف يحتوي سابقًا:
Old
ثم نفذنا:
with open("notes.txt", "w", encoding="utf-8") as file:
file.write("New")
في المثال التعليمي يصبح المحتوى:
New
ولا يبقى النص Old. لذلك لا نصف "w" بأنه وضع إضافة.
"a"إذا كان الملف يحتوي:
Ali
وأردنا إضافة اسم آخر، يمكن استخدام:
with open("notes.txt", "a", encoding="utf-8") as file:
file.write("\nSara")
النتيجة المفاهيمية هي:
Ali
Sara
لاحظ أننا أضفنا \n بأنفسنا. وضع "a" لا ينشئ newline تلقائيًا.
"r" و"w" و"a"| Mode | ماذا نريد؟ | المحتوى السابق |
|---|---|---|
"r" |
قراءة | نقرأه دون استخدام الوضع للكتابة |
"w" |
كتابة محتوى جديد | يبدأ المحتوى من جديد في الحالة المدروسة |
"a" |
إضافة في النهاية | يبقى المحتوى السابق وتضاف البيانات بعده |
Encoding يحدد الطريقة المستخدمة لتمثيل النص عند القراءة والكتابة.
في أمثلة هذا الفصل سنستخدم:
encoding="utf-8"
مثل:
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
استخدام UTF-8 مناسب للنصوص التي نعمل معها، بما في ذلك النصوص العربية.
لا نحتاج في هذا الفصل إلى دراسة التفاصيل الداخلية لـUnicode أو أنواع Encoding الأخرى.
عندما نكتب:
"notes.txt"
فهذا Relative Path بسيط يشير إلى ملف بهذا الاسم بالنسبة إلى موقع العمل الحالي للبرنامج.
ويمكن أن يظهر مسار بسيط مثل:
"data/notes.txt"
ليشير إلى ملف داخل مجلد باسم data.
لن ندخل هنا في Absolute Paths أو اختلاف أنظمة التشغيل أو Modules الخاصة بالمسارات.
القيمة الناتجة من read() هي String، لذلك يمكن استخدام String methods التي تعلمتها سابقًا.
لنفترض أن name.txt يحتوي اسمًا واحدًا:
Ali
يمكن قراءة الاسم وتنظيف المحارف البيضاء المحيطة به:
with open("name.txt", "r", encoding="utf-8") as file:
name = file.read().strip()
print(f"مرحبًا {name}")
بهذا ندمج قراءة الملف مع strip() وf-string.
يمكن استخدام الأسطر المقروءة مع المفاهيم السابقة.
لنفترض أن الملف يحتوي:
2
5
8
يمكن قراءة كل سطر وتحويل النص إلى عدد ثم تطبيق شرط بسيط:
count = 0
with open("numbers.txt", "r", encoding="utf-8") as file:
for line in file:
number = int(line.strip())
if number % 2 == 0:
count += 1
print(count)
القيم الزوجية هي 2 و8، لذلك تكون النتيجة 2.
يمكن استخدام Function سبق تعلمها لإنتاج نص، ثم كتابة النص الناتج.
def create_message(name):
return f"مرحبًا {name}"
message = create_message("Ali")
with open("message.txt", "w", encoding="utf-8") as file:
file.write(message)
تعيد Function النص "مرحبًا Ali"، ثم تخزن القيمة في message وتكتب في الملف.
الموضوع الأساسي هنا ما زال التعامل مع الملف؛ Function تستخدم فقط لدمج مفهوم سابق.
إذا أردت الاحتفاظ بالمحتوى السابق وإضافة نص جديد، فلا تستخدم "w" بدل "a".
"a" يضيف newline تلقائيًاوضع "a" يضيف المحتوى في النهاية، لكن الانتقال إلى سطر جديد يتطلب كتابة \n عند الحاجة.
read() Listفي الملفات النصية التي نستخدمها هنا، تعيد read() String.
readline() تقرأ الملف كاملًاreadline() تقرأ السطر التالي المتاح في الاستخدام الأساسي، وليس كل الأسطر في استدعاء واحد.
encoding="utf-8" في أمثلة الفصلسنستخدم UTF-8 بصورة ثابتة في أمثلة النصوص لتكون طريقة التعامل مع النص واضحة.
عند تحليل كود يقرأ ملفًا، يجب معرفة محتوى الملف إذا كان الناتج يعتمد عليه. لذلك نحدد محتوى الملفات بوضوح في أمثلة التدريب والاختبار.
"notes.txt" هو مسار أو اسم الملف في المثال، أما النص داخل الملف فهو البيانات التي نقرأها أو نكتبها.
افتح ملفًا نصيًا موجودًا بوضع "r" واقرأ محتواه باستخدام read().
استخدم readline() لقراءة أول سطر من ملف يحتوي عدة أسماء.
استخدم حلقة for للمرور على أسطر ملف، واطبع كل سطر بعد تطبيق strip().
اكتب اسمين في ملف باستخدام وضع "w"، واجعل كل اسم في سطر مستقل باستخدام \n.
ابدأ بملف يحتوي اسمًا واحدًا، ثم استخدم وضع "a" لإضافة اسم آخر دون حذف المحتوى السابق.
اقرأ اسمًا من ملف باستخدام read().strip()، ثم استخدمه داخل f-string.
أنشئ Function بسيطة تعيد رسالة نصية، ثم اكتب القيمة المعادة إلى ملف باستخدام write().
قارن بين استخدام "w" و"a" مع ملف يحتوي محتوى سابقًا، وحدد أيهما يناسب الاستبدال وأيهما يناسب الإضافة.
open() تستخدم لفتح الملف."r" يستخدم للقراءة."w" يستخدم للكتابة ويبدأ المحتوى من جديد عند فتح ملف موجود في الحالة المدروسة."a" يضيف المحتوى الجديد في نهاية الملف."a" لا يضيف newline تلقائيًا.with open(...) هي الصيغة الأساسية المستخدمة في أمثلة الفصل.with يتم التعامل مع إغلاق الملف تلقائيًا.read() تقرأ المحتوى كاملًا وتعيد String.readline() تقرأ السطر التالي المتاح.for للمرور على أسطر الملف.strip() مفيدة لمعالجة المحارف البيضاء حول السطر المقروء.write() تكتب String في الملف.\n يستخدم للانتقال إلى سطر جديد داخل النص المكتوب.encoding="utf-8" في أمثلة الملفات النصية."notes.txt" مثال على Relative Path بسيط.write().في الفصل التالي ستتعلم الأخطاء والاستثناءات، وكيفية التعامل مع الحالات التي لا يسير فيها تنفيذ البرنامج كما هو متوقع.
نشر في ١١ أغسطس ٢٠٢٦