2.2السلاسل والتنسيق (f-strings) والملفات
الأساسي في 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 لإبقاء الحروف مقروءة.
🔎 مثال ملموس — 🔎 مثال ملموس — دفتر نبيل الحاضر في 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.
في التطبيق — تطبيقيا — تنسيق النص وقراءة الملفات وكتابتها
- نظف وحول سلسلة : " تقرير الجزائر ".strip().upper()، ثم قطع سطر CSV إلى حقول بـ .split().
- ركب سطر تقرير بسلسلة f-string فيها حساب : f"المجموع : {prix * quantite:.2f} €" (رقمان عشريان).
- اكتب نصا بـ « with open("notes.txt", "w", encoding="utf-8") as f » ثم أعد قراءته بالنمط « r » : تحقق من الإغلاق التلقائي.
- حمِّل واحفظ قائمة قواميس في JSON بـ json.dump وjson.load : لاحظ الحضور بين تنفيذين.
نص جاهز — شرح 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.
أسئلة شائعة
لماذا نفضل سلاسل f-strings على الدمج بـ + ؟
سلاسل f-strings أمقرأ، وتتجنب أخطاء النوع (لا حاجة لتحويل الأعداد إلى str)، وتسمح بالتنسيق المدمج (: .2f لرقمين عشريين، والمحاذاة، والنسب). وهي الطريقة الموصى بها رسميا منذ بايثون 3.6.
ما الفرق بين أنماط « r » و« w » و« a » لـ open() ؟
« r » تقرأ (افتراضيا)، و« w » تكتب ماحية المحتوى الموجود، و« a » تضيف في النهاية (append) دون محو. انتبه : فتح ملف موجود بـ « w » يحذف محتواه فورا — ومن هنا فائدة إعادة القراءة قبل الكتابة.
ماذا يضمن المقطع « with open(...) » ؟