2.2 · السلاسل والتنسيق (f-strings) والملفات

المستوى 2 · هياكل البيانات والبرمجة كائنية التوجه

2.2السلاسل والتنسيق (f-strings) والملفات

الهدف: تنسيق النص وقراءة الملفات وكتابتها (txt وCSV وJSON).
الوقت المقدّر: 14 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • سلاسل f-strings في كل مكان : f"...{var}..." مقروءة وسريعة، بتنسيق مدمج (: .2f و:.0%) — انس % و.format() خارج القديم.
  • split تقطع وjoin تجمع وstrip تنظف : الثلاثي الذي يحول النص — in تختبر الوجود.
  • with تغلق وحدها : with open(..., encoding="utf-8") مع json/csv وpathlib — برامجك تحتفظ بذاكرة.

حالة مستمرة — نبيل يحرر التقرير الشهري

يجب على نبيل إرسال التقرير الشهري لمبيعات الجزائر : مبالغ منسقة برقمين عشريين، وأسماء منظفة (مسافات وحالة أحرف)، وسطور CSV مقطعة ومعاد تجميعها. نسخته الأولى تدمج بـ + وتنسى إغلاق ملفاته — حروف مكسورة وملف مقفل. أعاد البناء : سلاسل f-strings مع :.2f للمجاميع، وstrip/lower/split/join للتنظيف، وwith open(..., encoding="utf-8") للقراءة والكتابة، وJSON لجعل الدفتر حاضرا بين تنفيذين. في 2.3، ستصبح هذه السطور كائنات ؛ وفي 2.4، سيُدبَّر الملف الغائب بنظافة.

تتمة الخيط الرابط 2.1 : مبيعات نبيل تصبح تقريرا مقروءا وحاضرا — وتستمر في 2.3 و2.4.

1. سلاسل f-strings : الطريقة الحديثة الوحيدة

f"مرحبا {nom}, المجموع : {total:.2f} €" : مقروءة وسريعة، بتنسيق مدمج (f"{prix:.2f} €"، f"{ratio:.0%}"). المتغير أو الحساب يُدرَج مباشرة بين عاقفتين — لا تحويل يدوي ولا خطأ نوع. انس % و.format() خارج الكود القديم : سلسلة f-string هي المعيار منذ بايثون 3.6. نبيل يطبق ذلك : كل سطر من التقرير الشهري سلسلة f-string بمبالغ برقمين عشريين ونسب محسوبة على الطائر.

2. الطرق التي تدفع : split وjoin وstrip

"الجزائر, وهران, البليدة".split(", ") تقطع إلى قائمة، و", ".join(liste) تجمع (العكس تماما)، و.strip() تنظف مسافات المدخلات، و.lower() و.replace() توحد. .upper() تعرض، وin تختبر الوجود (if "@" in email:). هذه الطرق لا تعدل السلسلة الأصلية (السلاسل ثابتة) : بل تعيد سلسلة جديدة. نبيل ينظف هكذا كل اسم زبون (strip().title()) قبل مقارنته — انتهت تكرارات « الجزائر » مقابل « الجزائر ».

3. الملفات : with والترميز وJSON

with open("ventes.txt", encoding="utf-8") as f: — الـ with تغلق وحدها حتى عند الخطأ، وencoding="utf-8" يتجنب الحروف المكسورة. الأنماط : "r" يقرأ (افتراضي)، و"w" يكتب ماحيا، و"a" يضيف في النهاية. للهيكلة : json.load/dump (قوائم وقواميس حاضرة — الدفتر ينجو من إعادة التشغيل)، ووحدة csv للجداول، وpathlib.Path لمسارات نظيفة دون دمج. نبيل يحفظ ملخصه في JSON مع ensure_ascii=False لإبقاء الحروف مقروءة.

خطأ شائع في الفهم: « الدمج بـ + والفتح دون with يعملان أيضا ». لا. الدمج بـ + غير مقروء حالما نخلط النص والأعداد (ويسبب TypeError دون تحويل)، دون تنسيق مدمج ؛ وopen() دون with تترك الملف مفتوحا عند الخطأ (تسرب وقفل) ودون ترميز تكسر الحروف. قاعدة نبيل : سلسلة f-string للعرض، وsplit/join/strip للتحويل، وwith + الترميز للحفظ — ثلاث حركات وصفر مفاجآت.
النص والملفات اعرض وحول واحتفظ سلسلة f-string(اعرض) المتغيرات و:.2f مدمجةsplit/join (حول) قطعوجمع وتنظيفwith+JSON (احتفظ) تغلقوحدها والترميز والحاضر
اعرض وحول واحتفظ
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) نبيل يعرض بسلاسل f-strings : المتغيرات والحسابات بين عاقفتين، و:.2f للمبالغ، و:.0% للحصص — لا % ولا دمج. 2) يحول بـ split (يقطع) وjoin (يجمع) وstrip/lower/replace (ينظف ويوحد) وin للاختبار. 3) يحتفظ بـ with open(..., encoding="utf-8") التي تغلق وحدها، والأنماط r/w/a مميزة، وJSON للهيكلة وpathlib للمسارات. الدرس : اعرض وحول واحتفظ — بالأدوات الحديثة.

🔎 مثال ملموس — 🔎 مثال ملموس — دفتر نبيل الحاضر في JSON

الملخص ينجو من إعادة التشغيل، كما عند نبيل :

import json
from pathlib import Path
fichier = Path("recap.json")
if fichier.exists():
    recap = json.loads(fichier.read_text(encoding="utf-8"))
else:
    recap = []
recap.append({"wilaya": "الجزائر", "total": 1650})
fichier.write_text(json.dumps(recap, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"الولايات المتابعة : {len(recap)}")

القراءة : pathlib يتحقق من الوجود، وjson يحمل ويحفظ، وسلسلة f-string تعرض.

الدرس : pathlib تعوض دمجات المسارات.

مفردات القسم

طرق السلسلة
دوال ملحقة بالنص : .upper() و.lower() و.strip() (المسافات) و.split() (يقطع) و.join() (يجمع) و.replace(). تعيد سلسلة جديدة.

مثال بسيط: نبيل ينظف اسما بـ nom.strip().title().

ما ليس كذلك: دوال تعدل السلسلة مكانها.

رد فعل: تحويل نص = طريقة معادة.

سلسلة التنسيق (f-string)
سلسلة مسبوقة بـ f حيث {variable} يُستبدَل بقيمته : f"مرحبا {nom}". تنسيق مدمج (: .2f و:.0%). الطريقة الموصى بها منذ بايثون 3.6.

مثال بسيط: نبيل يكتب f"المجموع : {total:.2f} €".

ما ليس كذلك: دمج بـ + وstr() في كل مكان.

رد فعل: عرض قيم = سلسلة f-string.

with open()
يفتح ملفا مع ضمان إغلاقه التلقائي : with open("f.txt", encoding="utf-8") as f:. الأنماط r (يقرأ) وw (يمحو) وa (يضيف).

مثال بسيط: نبيل يقرأ التصدير بـ with والترميز utf-8.

ما ليس كذلك: open() دون with ولا ترميز.

رد فعل: ملف = with + ترميز، دائما.

CSV
ملف نصي حيث القيم مفصولة بفواصل : صيغة تبادل عالمية (الجداول). وحدة csv للقراءة والكتابة بنظافة.

مثال بسيط: نبيل يقطع كل سطر تصدير بوحدة csv.

ما ليس كذلك: تقطيع يدوي ينكسر على علامات الاقتباس.

رد فعل: جدول يُتبادَل = وحدة csv.

JSON
صيغة نصية مهيكلة (مفاتيح/قيم) عالمية للبيانات وAPI. وحدة json : ‏json.load / ‏json.dump، وقوائم وقواميس حاضرة.

مثال بسيط: ملخص نبيل ينجو من إعادة التشغيل في JSON.

ما ليس كذلك: ملف نصي مرتجل غير مقروء بأدوات أخرى.

رد فعل: مهيكل يُحتفَظ به = JSON.

في التطبيق — تطبيقيا — تنسيق النص وقراءة الملفات وكتابتها

  1. نظف وحول سلسلة : " تقرير الجزائر ".strip().upper()، ثم قطع سطر CSV إلى حقول بـ .split().
  2. ركب سطر تقرير بسلسلة f-string فيها حساب : f"المجموع : {prix * quantite:.2f} €" (رقمان عشريان).
  3. اكتب نصا بـ « with open("notes.txt", "w", encoding="utf-8") as f » ثم أعد قراءته بالنمط « r » : تحقق من الإغلاق التلقائي.
  4. حمِّل واحفظ قائمة قواميس في JSON بـ json.dump وjson.load : لاحظ الحضور بين تنفيذين.
تنسق النص بنظافة بسلاسل f-strings وتقرأ ملفات txt وCSV وJSON وتكتبها : برامجك تحتفظ بذاكرة.

نص جاهز — شرح with لزميل (30 ثانية)

« لتقرير نبيل، كل شيء يمر بسلاسل f-strings مع :.2f — لا مزيد من الدمج. وكل ملف يُفتَح بـ with والترميز utf-8 : يغلق وحده حتى عند التعطل، وحروف الجزائر تبقى سليمة. والملخص يذهب في JSON، فينجو من إعادة التشغيل. »

يُقال مع عرض ملف بقي مقفلا دون with، ثم نظيف مع with.

قالب للنسخ — تقرير منسق وحفظ JSON

import json
from pathlib import Path
lignes = ["  الجزائر,1650 ", "وهران,800", " الجزائر,450 "]
total = 0.0
for ligne in lignes:
    wilaya, montant = [c.strip() for c in ligne.split(",")]
    total += float(montant)
    print(f"{wilaya.title():<10} : {float(montant):.2f} €")
print(f"{'المجموع':<10} : {total:.2f} €")
Path("total.json").write_text(json.dumps({"total": total}, ensure_ascii=False, indent=2), encoding="utf-8")

سطر تقرير

كل عملية بيع لنبيل تصبح f"{wilaya} : {montant:.2f} €" — الحساب والتنسيق في سطر واحد.

أسماء توحَّد

الولايات المدخلة مشتتة تمر بـ strip().lower() : « الجزائر » و« الجزائر » لا تشكلان تكرارا.

تصدير CSV يُعاد قراءته

تصدير الشهر يُقطَّع بـ split/join عبر وحدة csv : الحقول وعلامات الاقتباس تُدبَّر بنظافة.

ملخص يُحتفَظ به

المجموع الشهري يذهب في JSON مع ensure_ascii=False : حروف سليمة، يُعاد قراءته الشهر التالي.

✓ ممارسات جيدة

  • استعمال سلاسل f-strings في كل مكان، بتنسيق مدمج (: .2f و:.0%).
  • تنظيف المدخلات منهجيا (strip وlower) قبل المقارنة.
  • الفتح بـ with + الترميز وتفضيل pathlib + ‏JSON للحفظ.

✗ أخطاء شائعة

  • الدمج بـ + بدل سلسلة f-string (غير مقروء وأخطاء نوع).
  • الفتح دون with (ملف غير مغلق عند الخطأ).
  • نسيان encoding="utf-8" (حروف مكسورة) أو الفتح بـ "w" لملف يجب حفظه (يُمحى).

النقاط الأساسية

  • طرق السلسلة (upper وstrip وsplit وjoin وreplace) تحول النص (سلسلة جديدة معادة).
  • سلاسل f-strings ‏(f"...{var}...") هي الطريقة الحديثة المقروءة للتنسيق، مع :.2f و:.0%.
  • with open(..., encoding="utf-8") تقرأ وتكتب مع الإغلاق التلقائي ؛ وr تقرأ، وw تمحو، وa تضيف.
  • CSV وJSON صيغتا تبادل (وحدتا csv وjson) ؛ وpathlib للمسارات.

تحدي 48 ساعة — طبق غدا

خذ ملف نص حقيقيا (ملف نبيل أو ملفك) : نظفه (strip/split/join)، واعرض ملخصا بسلاسل f-strings مع :.2f، واحفظه في JSON عبر with + الترميز وأعد قراءته بعد إعادة التشغيل.

قائمة الخروج من القسم
  • أستطيع التنسيق بسلاسل f-strings (متغيرات وحسابات و:.2f).
  • أعرف التنظيف بـ strip/split/join والاختبار بـ in.
  • قرأت ملفا وكتبته بـ with + الترميز، وحفظت في JSON.
تقييم ذاتي 1-5 : هل أستعمل سلاسل f-strings بدل + ؟هل كل open() بـ with مع الترميز ؟

أسئلة شائعة

لماذا نفضل سلاسل f-strings على الدمج بـ + ؟

سلاسل f-strings أمقرأ، وتتجنب أخطاء النوع (لا حاجة لتحويل الأعداد إلى str)، وتسمح بالتنسيق المدمج (: .2f لرقمين عشريين، والمحاذاة، والنسب). وهي الطريقة الموصى بها رسميا منذ بايثون 3.6.

ما الفرق بين أنماط « r » و« w » و« a » لـ open() ؟

« r » تقرأ (افتراضيا)، و« w » تكتب ماحية المحتوى الموجود، و« a » تضيف في النهاية (append) دون محو. انتبه : فتح ملف موجود بـ « w » يحذف محتواه فورا — ومن هنا فائدة إعادة القراءة قبل الكتابة.

تحقّق من فهمك

ماذا يضمن المقطع « with open(...) » ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 2أسئلة جديدة وأصعب للتحقق من مكتسباتك