› كل الدروس
الدرس 7 من 12 26 دقيقة

Files

اقرأ بيانات حقيقية من بره program

الفكرة باختصار

file مصدر بيانات بيفضل موجود بعد ما program يقفل — بنفتحه، نلف على سطوره، ونقفله.

بعد الدرس ده هتعرف

  • تفتح file وتقرا محتواه
  • تلف على سطور file وتفلتر اللي يهمك
  • تكتب في file جديد
  • تتعامل مع file مش موجود من غير ما program يقع
1

شوف الفكرة الأول

قبل أي code — افهم بيحصل إيه

2

الشرح

فكرة واحدة في كل خطوة

1

ليه files أصلاً؟

كل variables اللي عملناها لحد دلوقتي بتختفي أول ما program يقفل.

file هو المكان اللي البيانات بتعيش فيه بعد ما program يخلص. ودي بداية التعامل مع بيانات حقيقية — سجلات، قراءات، تقارير.

2

افتح، اقرا، اقفل

open("file.txt") بتفتح file وبترجّع مقبض (handle) — مش محتوى file.

فكّر فيه كإنه «خيط» موصّلك بـ file. عشان توصل للمحتوى بتلف عليه أو بتقرا منه.

مهم: بعد ما تخلص، اقفل file بـ .close() عشان تفضي الموارد.

Python
1# fhand = open("data.txt")
2# text = fhand.read()
3# fhand.close()
4print("this is the shape of the code — the sim runs on a ready string")
الناتج
this is the shape of the code — the sim runs on a ready string
3

with — الطريقة الأنضف

بدل ما تفتكر تقفل file، استخدم with. Python بتقفله لوحدها لما تخرج من الكتلة، حتى لو حصل error في string.

دي الطريقة اللي المبرمجين بيستخدموها فعلًا.

Python
1# with open("data.txt") as fhand:
2# for line in fhand:
3# print(line.strip())
4print("with closes the file by itself")
الناتج
with closes the file by itself
4

اللف على السطور

file بيتعامل زي list من السطور. for line in fhand بتدّيك سطر سطر.

كل سطر بييجي ومعاه \n في آخره — عشان كده بنستخدم .strip() قبل ما نشتغل على السطر.

هنا بنحاكي file بـ list سطور عشان تشوف المنطق بالظبط.

Python
1lines = ["Abdelrahman,90", "Mona,78", "Omar,65"]
2for line in lines:
3 parts = line.split(",")
4 print(f"{parts[0]} scored {parts[1]}")
الناتج
Abdelrahman scored 90
Mona scored 78
Omar scored 65
5

الفلترة — خد اللي يهمك بس

في files الحقيقية مش كل السطور تهمك. بتستخدم if جوّه loop عشان تختار.

Python
1lines = ["OK: 36.5", "ALERT: 39.2", "OK: 37.0", "ALERT: 38.8"]
2alerts = 0
3for line in lines:
4 if not line.startswith("ALERT"):
5 continue
6 alerts = alerts + 1
7 print(line)
8print(f"alert count: {alerts}")
الناتج
ALERT: 39.2
ALERT: 38.8
alert count: 2
6

الكتابة في file

open("out.txt", "w") بتفتح للكتابة.

تحذير: الوضع "w" بيمسح محتوى file القديم كله. لو عايز تضيف في الآخر من غير مسح، استخدم "a" (append).

ولاحظ إن .write() مش بتضيف سطر جديد لوحدها — لازم تكتب \n بنفسك.

Python
1# with open("report.txt", "w") as out:
2# out.write("Report\n")
3# out.write("passed: 12\n")
4print("w = erase and write | a = append at the end")
الناتج
w = erase and write | a = append at the end
7

لو file مش موجود

لو الاسم غلط أو file مش موجود، program هيقع بـ FileNotFoundError.

الحل: try/except — نفس اللي اتعلمناه في درس conditions.

Python
1name = "missing.txt"
2try:
3 fhand = open(name)
4except:
5 print(f"file {name} not found — check the name")
الناتج
file missing.txt not found — check the name
8

تلات طرق تقرا بيهم — واختار إيه

.read() → file كله في string واحد. مريح لـ files الصغيرة، كارثة للكبيرة (بيحمّل كل حاجة في الذاكرة).

.readlines() → list فيها كل السطور. برضه بيحمّل كله.

for line in fhand → سطر سطر، والذاكرة فيها سطر واحد بس في أي لحظة. دي الطريقة الصح لأي file حقيقي.

القاعدة: لو مش متأكد، لف على file سطر سطر.

Python
1# same idea with a list standing in for file lines
2lines = ["first line", "second line", "third line"]
3print("line count:", len(lines))
4for line in lines:
5 print("←", line)
الناتج
line count: 3
← first line
← second line
← third line
9

file CSV بإيدك — سطر عناوين وبيانات

CSV مجرد text file، كل سطر فيه values مفصولة بفواصل. وأول سطر غالبًا العناوين.

الخطوات: خد أول سطر كعناوين، بعدين لف على الباقي وقسّم كل سطر، واربط كل value بعنوانها.

ده بالظبط اللي بتعمله library csv — بس لما تعملها بإيدك مرة، هتفهمها للأبد.

Python
1rows = ["name,dept,grade", "Abdelrahman,IT,90", "Mona,CS,78"]
2headers = rows[0].split(",")
3print("Columns:", headers)
4for row in rows[1:]:
5 parts = row.split(",")
6 print(f"{parts[0]} ({parts[1]}) ← {parts[2]}")
الناتج
Columns: ['name', 'dept', 'grade']
Abdelrahman (IT) ← 90
Mona (CS) ← 78
10

البيانات الوحشة — السطر الناقص

في files الحقيقية هتلاقي سطر ناقص عمود، أو فيه مسافات زيادة، أو فاضي خالص.

لو ما حميتش code بتاعك، السطر الواحد ده هيوقّع program كله بعد ما يكون شغّال تمام على 999 سطر.

الحماية: افحص عدد الأجزاء بعد split، ونضّف بـ strip، وتجاهل اللي مش مظبوط.

Python
1rows = ["Abdelrahman,90", " ", "Mona", "Omar,65"]
2good = 0
3for row in rows:
4 parts = row.strip().split(",")
5 if len(parts) != 2:
6 print("bad row:", "[" + row.strip() + "]")
7 continue
8 good += 1
9print("good rows:", good)
الناتج
bad row: []
bad row: [Mona]
good rows: 2
3

وده كمان شوفه متحرك

الفكرة دي أسهل ما تتشاف من ما تتقرا

4

أمثلة محلولة

شوف إزاي بنفكّر قبل ما نكتب

مثال 1

عدّ سطور file

المطلوب: عدّ كام سطر في file، وكام سطر منهم فاضي.

نفكّر إزاي؟

  1. 1كل لفّة على file = سطر
  2. 2السطر الفاضي بعد .strip() بيبقى string فاضي
  3. 3عدّادين: واحد للكل وواحد للفاضي
مثال 2

تجاهل السطور الفاضية والتعليقات

المطلوب: اقرا بيانات وتجاهل السطور الفاضية واللي بتبدأ بـ #.

نفكّر إزاي؟

  1. 1أنضّف السطر الأول بـ .strip()
  2. 2لو فاضي أو بيبدأ بـ # → continue
  3. 3الباقي هو البيانات الحقيقية
مثال 3

جمّع إحصائية من السطور

المطلوب: كل سطر فيه «اسم,درجة». احسب المتوسط وعدد الناجحين.

نفكّر إزاي؟

  1. 1كل سطر لازم يتقسّم بـ .split(",")
  2. 2الدرجة بتيجي كـ string → int()
  3. 3عدّاد ومجمّع الاتنين قبل loop
مثال 4

ابني تقرير كـ string جاهز للكتابة

المطلوب: جهّز محتوى file تقرير في variable واحد قبل ما تكتبه.

نفكّر إزاي؟

  1. 1\n بتنزل سطر جوّه string
  2. 2أجمّع المحتوى في variable وأنا بلف
  3. 3في الآخر out.write(report) مرة واحدة
مثال 5

file مش موجود — من غير ما program يقع

المطلوب: جرّب تفتح file مش موجود واطبع رسالة مفهومة بدل ما program يقف.

نفكّر إزاي؟

  1. 1open بتطلّع FileNotFoundError لو الاسم غلط
  2. 2code الخطر جوّه try
  3. 3بعد الرسالة program بيكمّل عادي
مثال 6

أعلى وأقل قراءة في سجل

المطلوب: من سجل قراءات حرارة، اطبع أعلى وأقل قراءة ومين صاحبها.

نفكّر إزاي؟

  1. 1أبدأ بأعلى = صفر وأقل = رقم كبير جدًا
  2. 2كل سطر أقارن وأحدّث لو لقيت أحسن
  3. 3أحتفظ بالاسم مع value
5

ورقة مراجعة

ارجعلها وإنت بتحل — مش محتاج تحفظها

التعامل مع files
الحاجةمعناهامثالالناتج
open(f)يفتح للقراية ويرجّع مقبضfh = open("a.txt")مقبض مش محتوى
open(f, "w")يفتح للكتابة — بيمسح القديمopen("a.txt", "w")file بقى فاضي
open(f, "a")يضيف في الآخرopen("a.txt", "a")القديم موجود
.read()المحتوى كله كـ string واحدfh.read()string طويل
for line in fhسطر سطرfor l in fh:كل سطر ومعاه \n
.strip()يشيل \n والمسافاتline.strip()سطر نضيف
.write(s)يكتب string (من غير سطر جديد)out.write("a\n")اتكتب
.close()يقفل filefh.close()الموارد اتفضّت
with open(...) as f:بيقفل لوحده في الآخرwith open("a") as f:أأمن طريقة
try / exceptيحمي من file مش موجودexcept:program ما يقعش
6

تحليل سجل قراءات

شوفه بيشتغل سطر سطر

شغّل code خطوة خطوة

ده السيناريو الحقيقي: بنلف على سطور، نفصل كل سطر، نحوّل الأرقام، ونحسب إحصائية. نفس المنطق بالظبط لو البيانات جاية من file.

1log = ["Abdelrahman,36.5", "Mona,38.9", "Omar,37.1", "Sara,39.4", "Hany,36.8"]◂
2fever = 0
3total = 0
4for line in log:
5 parts = line.split(",")
6 name = parts[0]
7 temp = float(parts[1])
8 total = total + temp
9 if temp > 37.5:
10 fever = fever + 1
11 print(f"!! {name}: {temp}")
12print(f"average: {total/len(log):.2f}")
13print(f"fever cases: {fever} of {len(log)}")
الذاكرة
log['Abdelrahman,36.5', 'Mona,38.9', 'Omar,37.1', 'Sara,39.4', 'Hany,36.8']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['Abdelrahman,36.5', 'Mona,38.9', 'Omar,37.1', 'Sara,39.4', 'Hany,36.8'] جوّه log

خطوة 142 خطوة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

7

غلطات بتحصل كتير

شوفها هنا بدل ما تضيّع ساعة فيها

غلط
fhand = open("data.txt")
print(fhand)
صح
fhand = open("data.txt")
print(fhand.read())

open بترجّع مقبض file مش محتواه. لازم .read() أو تلف عليه.

غلط
for line in fhand:
    print(line)
صح
for line in fhand:
    print(line.strip())

كل سطر بييجي ومعاه \n، فبتطلع سطور فاضية بينهم.

غلط
open("notes.txt", "w")  # file has important data
صح
open("notes.txt", "a")

الوضع "w" بيمسح كل اللي في file. استخدم "a" لو عايز تضيف.

8

مسائل سريعة

فكّر الأول — بعدين اكشف

1

إيه اللي open("a.txt") بترجّعه؟

2

ليه بيظهر سطر فاضي بين كل سطرين؟

1lines = ["a\n", "b\n"]
2for line in lines:
3 print(line)
3

إيه الناتج؟

1line = "Abdelrahman,90\n"
2print(line.strip().split(","))
4

الوضع "w" بيعمل إيه لو file فيه بيانات؟

5

إيه type parts[1] هنا؟

1parts = "Abdelrahman,90".split(",")
2print(type(parts[1]))
6

إيه فايدة with؟

7

إيه اللي هيتطبع؟

1lines = ["#note", "Abdelrahman"]
2for l in lines:
3 if l.startswith("#"):
4 continue
5 print(l)
8

إيه error اللي بيحصل لو file مش موجود؟

9

جرّب بنفسك

اكتب code — ده الجزء اللي بيعلّم فعلاً

جرّب بنفسك

عندك list سطور كل واحد فيه «اسم,درجة». اطبع اسم أعلى طالب بس.

شغّل code خطوة خطوة
1lines = ["Abdelrahman,78", "Mona,91", "Omar,65"]◂
2best_name = ""
3best_grade = 0
4# write here
5
الذاكرة
lines['Abdelrahman,78', 'Mona,91', 'Omar,65']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['Abdelrahman,78', 'Mona,91', 'Omar,65'] جوّه lines

خطوة 14 خطوات
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 2
جرّب بنفسك

عندك سطور سجل زي "ALERT: 39.2" و "OK: 36.5". اطبع عدد التنبيهات ومتوسط قراءات التنبيهات بس.

شغّل code خطوة خطوة
1lines = ["OK: 36.5", "ALERT: 39.2", "OK: 37.0", "ALERT: 38.8"]◂
2# write here
3
الذاكرة
lines['OK: 36.5', 'ALERT: 39.2', 'OK: 37.0', 'ALERT: 38.8']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['OK: 36.5', 'ALERT: 39.2', 'OK: 37.0', 'ALERT: 38.8'] جوّه lines

خطوة 1خطوتين
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 3
جرّب بنفسك

كل سطر فيه «اسم,قسم,درجة». اطبع أسماء طلبة قسم IT بس مع درجاتهم.

شغّل code خطوة خطوة
1rows = ["Abdelrahman,IT,90", "Mona,CS,78", "Omar,IT,65"]◂
2# write here
3
الذاكرة
rows['Abdelrahman,IT,90', 'Mona,CS,78', 'Omar,IT,65']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['Abdelrahman,IT,90', 'Mona,CS,78', 'Omar,IT,65'] جوّه rows

خطوة 1خطوتين
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 4
جرّب بنفسك

جهّز string تقرير فيه عنوان وخط فاصل وكل سطر بيانات، واطبعه (كأنك هتكتبه في file).

شغّل code خطوة خطوة
1rows = ["Abdelrahman,90", "Mona,78"]◂
2report = ""
3# write here
4
الذاكرة
rows['Abdelrahman,90', 'Mona,78']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['Abdelrahman,90', 'Mona,78'] جوّه rows

خطوة 13 خطوات
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

10

اختبر نفسك

كل إجابة معاها السبب

1

إيه أحسن طريقة تقرا file كبير جدًا؟

2

إيه type parts[1] هنا؟

1parts = "Abdelrahman,90".split(",")
2print(type(parts[1]))
3

إيه فايدة with open(...) as f: ؟

4

إيه اللي هيتطبع؟

1lines = ["#note", "Abdelrahman"]
2for l in lines:
3 if l.startswith("#"):
4 continue
5 print(l)
5

إيه اللي open("data.txt") بترجّعه؟

6

ليه بنستخدم .strip() مع سطور file؟

7

إيه الفرق بين الوضع "w" و "a"؟

خلصت الدرس؟

علّم عليه عشان تعرف إنت وصلت لفين لما ترجع تاني.

الدرس اللي بعده: Lists ←