الرئيسية › الدروس › الملفات (Fichiers)
ملفات النص وملفات المعطيات بـ Algo وPython (pickle)
خلّي المعطيات بعد ما يوفى البرنامج: ملفات نص سطر بسطر، ملفات معطيات فيها enregistrements، وفرز ملف.
دروس هذا الفصل
- ملف النص
- معالجة ملف نص
- ملف المعطيات
- فرز ملف
الدرس 23.1 : ملف النص
المتغيّرات تمشي كي البرنامج يوقف. الـ fichier يخلّي المعطيات على الـ disque. ملف النص فيه أسطر حروف، كيما وثيقة الـ bloc-notes.
Ouvrir("prenoms.txt", F, "w")تصنع الفيشي (وتمسحو كان موجود). الـ mode"r"للقراءة،"a"للزيادة في الآخر.Ecrire_nl(F, ch)تكتب ch وتتعدّى لسطر جديد.Lire_ligne(F, ch)تقرا السطر اللي بعدو.Fin_fichier(F)صحيحة كي نقراو كل شيء.Fermer(F)توفّي الخدمة على الفيشي.
في Python
f = open("notes.txt", "w")،f.write(ch + "\n")،f.close().f.readline()ترجّع السطر مع الـ\nمتاعو؛ ننحّيوه بـ.rstrip("\n"). في آخر الفيشي، ترجّع chaîne فارغة.
انتبه : Python ما عندوش Fin_fichier: نقراو ما دام السطر موش فارغ. إذن تجنّب الأسطر الفارغة في وسط الفيشي.
نصيحة : هوني، الفيشيات يتصنعو في dossier وحدو متاع البرنامج متاعك: يتفرّغ في كل تمرين.
بـ Python
نكتبو ثلاثة مدن في فيشي، وبعد نعاودو نقراوه سطر بسطر.
f = open("villes.txt", "w")
f.write("Tunis" + "\n")
f.write("Sfax" + "\n")
f.write("Tozeur" + "\n")
f.close()
f = open("villes.txt", "r")
n = 0
ch = f.readline().rstrip("\n")
while ch != "":
n = n + 1
print(n, ch)
ch = f.readline().rstrip("\n")
f.close()
بـ algorithme
في الـ algorithme، الـ boucle توقف بـ Fin_fichier(F).
Algorithme Villes
Début
Ouvrir("villes.txt", F, "w")
Ecrire_nl(F, "Tunis")
Ecrire_nl(F, "Sfax")
Ecrire_nl(F, "Tozeur")
Fermer(F)
Ouvrir("villes.txt", F, "r")
n ← 0
Tant que Non Fin_fichier(F) Faire
Lire_ligne(F, ch)
n ← n + 1
Ecrire(n, " ", ch)
FinTantQue
Fermer(F)
Fin
TDO
Objet | Type/Nature
F | Fichier texte
n | Entier
ch | Chaîne
الدرس 23.2 : معالجة ملف نص
ياسر مرّات نقراو فيشي معمّر من قبل باش نطلّعو منو معلومة: نعدّو الأسطر، نحسبو معدّل، نلوّجو على كلمة، ولا ننسخو جزء من الأسطر في فيشي آخر.
- السطر اللي نقراوه chaîne: حوّلو بـ
Valeur(ch)(في Pythonint(ch)ولاfloat(ch)) باش تحسب. - باش ننسخو، نفتحو زوز فيشيات: واحد للقراءة (
"r")، والآخر للكتيبة ("w").
نصيحة : في تمارين الدرس هذا، الفيشي الأوّل موجود من قبل في dossier البرنامج.
بـ Python
الفيشي temperatures.txt فيه حرارة في كل سطر. نحسبو المعدّل.
f = open("temperatures.txt", "r")
s = 0
n = 0
ch = f.readline().rstrip("\n")
while ch != "":
s = s + int(ch)
n = n + 1
ch = f.readline().rstrip("\n")
f.close()
print("Moyenne :", s / n)
بـ algorithme
Valeur(ch) تحوّل السطر لعدد.
Algorithme Moyenne
Début
Ouvrir("temperatures.txt", F, "r")
s ← 0
n ← 0
Tant que Non Fin_fichier(F) Faire
Lire_ligne(F, ch)
s ← s + Valeur(ch)
n ← n + 1
FinTantQue
Fermer(F)
Ecrire("Moyenne : ", s / n)
Fin
TDO
Objet | Type/Nature
F | Fichier texte
s, n | Entier
ch | Chaîne
الدرس 23.3 : ملف المعطيات
ملف المعطيات (ولا fichier typé) يحطّ قيم من نفس النوع: أعداد صحيحة، ولا enregistrements كاملين (تلميذ كامل في كل مرّة). نفتحوه بالـ mode binaire: "wb"، "rb"، "ab".
- TDNT:
FEleves = Fichier d'Eleve؛ TDO:F | FEleves. Ecrire(F, e)تكتب تلميذ كامل،Lire(F, e)تقرا التلميذ اللي بعدو.- في Python:
from pickle import dump, load، وبعدdump(e, f)وe = load(f).
انتبه : Python ما عندوش Fin_fichier للفيشيات هذي: load تطلّع الغلطة EOFError في الآخر. إذن نقراو داخل try، و except EOFError يوقّف الـ boucle.
بـ Python
نسجّلو ثلاثة تلاميذ، وبعد نعاودو نقراو الفيشي باش نكتبو الناجحين.
from pickle import dump, load
f = open("classe.dat", "wb")
for i in range(3):
e = {"nom": "", "moy": 0.0}
e["nom"] = input()
e["moy"] = float(input())
dump(e, f)
f.close()
f = open("classe.dat", "rb")
arret = False
while not arret:
try:
e = load(f)
if e["moy"] >= 10:
print(e["nom"], e["moy"])
except EOFError:
arret = True
f.close()
بـ algorithme
في الـ algorithme، Fin_fichier(F) توقّف القراءة.
Algorithme Admis
Début
Ouvrir("classe.dat", F, "wb")
Pour i de 1 à 3 Faire
Lire(e.nom)
Lire(e.moy)
Ecrire(F, e)
FinPour
Fermer(F)
Ouvrir("classe.dat", F, "rb")
Tant que Non Fin_fichier(F) Faire
Lire(F, e)
Si e.moy ≥ 10 Alors
Ecrire(e.nom, " ", e.moy)
FinSi
FinTantQue
Fermer(F)
Fin
TDNT
Eleve = Enregistrement
nom : Chaîne
moy : Réel
Fin
FEleves = Fichier d'Eleve
TDO
Objet | Type/Nature
F | FEleves
e | Eleve
i | Entier
الدرس 23.4 : فرز ملف
ما نفرزوش مباشرة في الفيشي. نخدمو على ثلاثة مراحل، في الذاكرة المركزية:
- ننقلو محتوى الفيشي لـ tableau.
- نفرزو الـ tableau (sélection، bulles، insertion…).
- نعاودو نكتبو الـ tableau المفروز في الفيشي (مفتوح بـ
"w").
نصيحة : نفس الطريقة تخدم باش ندخّلو ولا ننحّيو عنصر في وسط الفيشي: نبدّلوه في الـ tableau، وبعد نعاودو نكتبو الفيشي الكل.
بـ Python
الفيشي ages.txt يتنقل لـ liste، يتفرز بالـ sélection، وبعد يتعاود يتكتب.
f = open("ages.txt", "r")
t = [0] * 50
n = 0
ch = f.readline().rstrip("\n")
while ch != "":
t[n] = int(ch)
n = n + 1
ch = f.readline().rstrip("\n")
f.close()
for i in range(n - 1):
pmin = i
for j in range(i + 1, n):
if t[j] < t[pmin]:
pmin = j
aux = t[i]
t[i] = t[pmin]
t[pmin] = aux
f = open("ages.txt", "w")
for i in range(n):
f.write(str(t[i]) + "\n")
f.close()
f = open("ages.txt", "r")
ch = f.readline().rstrip("\n")
while ch != "":
print(ch)
ch = f.readline().rstrip("\n")
f.close()
بـ algorithme
الثلاثة مراحل: النقل، الفرز، وإعادة الكتيبة.
Algorithme TrierFichier
Début
Ouvrir("ages.txt", F, "r")
n ← 0
Tant que Non Fin_fichier(F) Faire
Lire_ligne(F, ch)
n ← n + 1
T[n] ← Valeur(ch)
FinTantQue
Fermer(F)
Pour i de 1 à n - 1 Faire
pmin ← i
Pour j de i + 1 à n Faire
Si T[j] < T[pmin] Alors
pmin ← j
FinSi
FinPour
aux ← T[i]
T[i] ← T[pmin]
T[pmin] ← aux
FinPour
Ouvrir("ages.txt", F, "w")
Pour i de 1 à n Faire
Ecrire_nl(F, convch(T[i]))
FinPour
Fermer(F)
Ouvrir("ages.txt", F, "r")
Tant que Non Fin_fichier(F) Faire
Lire_ligne(F, ch)
Ecrire(ch)
FinTantQue
Fermer(F)
Fin
TDO
Objet | Type/Nature
F | Fichier texte
T | Tableau de 50 Entiers
n, i, j, pmin, aux | Entier
ch | Chaîne
تدرّب مجانًا
كل درس فيه 3 تمارين مجانية مع تلميحات باش تطبّق الفصل هذا مع هنّيبوت.
← الفصل اللي قبل : الخوارزميات التراجعية · الفصل اللي بعد : فرز Shell، الفرز بالعدّ، والدمج →
كل الفصول · شوف فروض 2 تكنولوجيا المصلّحة
الدروس كتبناها لـ Mission Carthage على أساس البرنامج الرسمي. الأستاذ متاعك يبقى المرجع.