للتعامل مع الملفات في بايثون، استخدم غالبًا with open(...) لفتح الملف بأمان، ثم اختر وضع الفتح المناسب: r للقراءة، w للكتابة مع استبدال المحتوى القديم، وa للإضافة في نهاية الملف. بعد فتح الملف يمكنك استخدام read() أو المرور على الأسطر باستخدام for للقراءة، وwrite() للكتابة.
في هذا الدرس من كورس أساسيات بايثون ستتعلم فتح وقراءة وكتابة الملفات النصية خطوة بخطوة، والفرق بين read() وreadline() وreadlines()، ولماذا نستخدم with وencoding="utf-8"، وماذا يحدث عند استخدام w أو محاولة قراءة ملف غير موجود. وسنطبق ذلك على ملفات .txt بأمثلة صغيرة يمكنك تشغيلها وتعديلها بنفسك.
{getToc} $title={محتوى المقال}
الخلاصة السريعة: ابدأ بـwith open("file.txt", "r", encoding="utf-8")عند قراءة ملف نصي، وغيّر وضع الفتح إلىwللكتابة من الصفر أوaللإضافة دون حذف المحتوى السابق. {alertInfo}
ما المقصود بالتعامل مع الملفات في بايثون؟
التعامل مع الملفات يعني أن برنامج بايثون يستطيع فتح ملف موجود على جهازك، قراءة محتواه، كتابة بيانات جديدة داخله، أو إضافة بيانات في نهايته.
أبسط مثال على ذلك: لديك ملف اسمه notes.txt يحتوي على ملاحظات، وتريد أن يقرأه برنامجك ويطبع محتواه على الشاشة.
أو تريد أن يطلب البرنامج من المستخدم إدخال اسمه، ثم يحفظ الاسم داخل ملف بدل أن يختفي بعد انتهاء تشغيل البرنامج.
التعامل مع الملفات مهم في مشاريع كثيرة، مثل:
- حفظ نتائج برنامج بسيط.
- قراءة بيانات من ملف نصي.
- إنشاء سجل للعمليات أو الأخطاء.
- حفظ قائمة أسماء أو مهام.
- بناء مشاريع تدريبية تعتمد على ملفات
.txt.
فتح ملف في بايثون باستخدام open وwith
الدالة المدمجة open() تفتح الملف وتعيد كائنًا يمكن القراءة منه أو الكتابة إليه. الشكل المبسط هو:
file = open("filename.txt", "r", encoding="utf-8")
لكن في الاستخدام اليومي الأفضل أن تجمع open() مع with حتى يُغلق الملف تلقائيًا عند انتهاء الكتلة:
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
notes.txt: اسم الملف أو مساره.r: وضع القراءة، وهو الوضع الافتراضي إذا لم تحدد Mode.encoding="utf-8": يحدد ترميز النص بدل الاعتماد على الإعداد الافتراضي للنظام.
إذا بدأت لاحقًا بتنظيم ملفات داخل مجلدات ومسارات متعددة، فراجع شرح pathlib في بايثون للتعامل مع المسارات بدل تركيب المسارات يدويًا.
قاعدة عملية: في الملفات النصية استخدم with open(..., encoding="utf-8") كصيغة افتراضية جيدة، ثم اختر Mode حسب ما تريد فعله بالملف. {alertSuccess}
ماذا عن close() وإغلاق الملف يدويًا؟
إذا استخدمت open() بدون with، يجب أن تغلق الملف بعد الانتهاء لتحرير مورد الملف والتأكد من إنهاء عمليات الكتابة المخبأة.
file = open("notes.txt", "r", encoding="utf-8")
# هنا نستخدم الملف
file.close()
لهذا السبب ستجد أن أمثلة هذا الدرس تعتمد غالبًا على with open(...) بدل الإغلاق اليدوي.
قراءة ملف نصي باستخدام read
لنفترض أن لديك ملفًا اسمه notes.txt ومحتواه:
Welcome to Python
Learning files is important
يمكنك قراءة محتوى الملف بهذا الشكل:
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
الناتج سيكون محتوى الملف كاملًا:
Welcome to Python
Learning files is important
الدالة read() تقرأ محتوى الملف كاملًا كنص واحد. هذا مناسب للملفات الصغيرة، أما الملفات الكبيرة فغالبًا يكون المرور على الملف سطرًا سطرًا أكثر كفاءة في الذاكرة.
لماذا نستخدم with open عند التعامل مع الملفات؟
استخدام with open(...) يجعل عمر الملف مرتبطًا بكتلة الكود: عند الخروج منها يُغلق الملف تلقائيًا، حتى إذا حدث استثناء أثناء التنفيذ. لذلك هي الصيغة الأنسب لمعظم أمثلة القراءة والكتابة للمبتدئين.
with open("notes.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
لاحظ أننا لم نكتب file.close()، لأن with تتكفل بإغلاق الملف تلقائيًا.
الأفضل للمبتدئين: استخدم with open(...) عند قراءة أو كتابة الملفات، لأنها أوضح وأكثر أمانًا. {alertSuccess}
قراءة الملف سطرًا سطرًا باستخدام readline
إذا كنت تريد قراءة سطر واحد فقط من الملف، يمكنك استخدام readline().
with open("notes.txt", "r", encoding="utf-8") as file:
line = file.readline()
print(line)
هذا الكود يقرأ السطر الأول فقط من الملف.
ولو كتبت readline() مرة أخرى، سيقرأ السطر التالي:
with open("notes.txt", "r", encoding="utf-8") as file:
first_line = file.readline()
second_line = file.readline()
print(first_line)
print(second_line)
قراءة كل الأسطر باستخدام readlines
الدالة readlines() تقرأ كل أسطر الملف وتضعها داخل قائمة List.
with open("notes.txt", "r", encoding="utf-8") as file:
lines = file.readlines()
print(lines)
قد تكون النتيجة مثل:
['Welcome to Python\n', 'Learning files is important']
لاحظ وجود \n في نهاية السطر الأول. هذا الرمز يعني سطرًا جديدًا.
قراءة الملف باستخدام for loop
من الطرق العملية والمفيدة قراءة الملف سطرًا سطرًا باستخدام حلقة for.
with open("notes.txt", "r", encoding="utf-8") as file:
for line in file:
print(line)
هذه الطريقة ممتازة عندما يكون الملف كبيرًا، لأن البرنامج يتعامل مع كل سطر بالتدريج بدل قراءة الملف كله مرة واحدة.
كتابة نص داخل ملف باستخدام write
للكتابة داخل ملف، نستخدم وضع الفتح w، ثم نستخدم الدالة write().
with open("output.txt", "w", encoding="utf-8") as file:
file.write("Hello Python")
هذا الكود ينشئ ملفًا اسمه output.txt إذا لم يكن موجودًا، ثم يكتب داخله النص:
Hello Python
انتبه: وضع الكتابة w يمسح محتوى الملف القديم إذا كان الملف موجودًا، ثم يكتب المحتوى الجديد. {alertWarning}
كتابة أكثر من سطر داخل الملف
إذا أردت كتابة أكثر من سطر، استخدم الرمز \n لإنشاء سطر جديد.
with open("output.txt", "w", encoding="utf-8") as file:
file.write("First line\n")
file.write("Second line\n")
file.write("Third line")
سيصبح محتوى الملف:
First line
Second line
Third line
إضافة نص إلى نهاية الملف باستخدام a
إذا أردت إضافة محتوى جديد في نهاية الملف بدون حذف المحتوى القديم، استخدم وضع الإضافة a.
with open("output.txt", "a", encoding="utf-8") as file:
file.write("\nNew line added")
هنا لن يتم حذف النص القديم، بل سيتم إضافة السطر الجديد في آخر الملف.
قاعدة سهلة: استخدمwللكتابة من الصفر، واستخدمaللإضافة على ملف موجود بدون حذف محتواه. {alertSuccess}
الفرق بين r و w و a في فتح الملفات
| الوضع | المعنى | ماذا يحدث؟ | متى تستخدمه؟ |
|---|---|---|---|
r |
Read | يفتح الملف للقراءة فقط | عندما تريد قراءة محتوى ملف موجود |
w |
Write | ينشئ ملفًا جديدًا أو يمسح محتوى الملف الموجود | عندما تريد كتابة محتوى جديد من البداية |
a |
Append | يضيف المحتوى في نهاية الملف | عندما تريد الإضافة بدون حذف القديم |
x |
Create | ينشئ ملفًا جديدًا ويعطي خطأ إذا كان الملف موجودًا | عندما تريد التأكد أن الملف لا يوجد مسبقًا |
b |
Binary | يُضاف إلى Mode مثل rb وwb للتعامل مع البيانات كـ bytes |
للصور والملفات الثنائية بدل النصوص |
+ |
Update | يُضاف إلى Mode للسماح بالقراءة والكتابة معًا مثل r+ |
عندما تحتاج تحديث الملف في نفس الجلسة |
للمبتدئ: ركّز أولًا على r وw وa. الوضع r هو الافتراضي، وw يمسح المحتوى القديم إذا كان الملف موجودًا، بينما a يحافظ عليه ويضيف في النهاية. أما b و+ فهما مهمان لاحقًا عند التعامل مع ملفات ثنائية أو تحديث الملف قراءةً وكتابةً.
مثال عملي: حفظ أسماء الطلاب في ملف
لنكتب برنامجًا بسيطًا يطلب من المستخدم إدخال اسم طالب، ثم يحفظه داخل ملف.
student_name = input("Enter student name: ")
with open("students.txt", "a", encoding="utf-8") as file:
file.write(student_name + "\n")
print("Student saved successfully")
استخدمنا هنا الوضع a حتى نضيف كل اسم جديد في نهاية الملف بدون حذف الأسماء السابقة.
مثال عملي: قراءة أسماء الطلاب من ملف
بعد حفظ الأسماء في ملف students.txt، يمكننا قراءة الأسماء وطباعتها:
with open("students.txt", "r", encoding="utf-8") as file:
for student in file:
print(student.strip())
استخدمنا strip() لإزالة السطر الجديد \n والمسافات الزائدة من بداية ونهاية كل اسم.
لماذا استخدمنا strip عند القراءة؟
عند قراءة الأسطر من ملف، غالبًا يحتوي كل سطر على رمز نهاية السطر \n. لذلك قد تظهر مسافة أو سطر فارغ عند الطباعة.
مثال:
name = "Ahmed\n"
print(name)
print(name.strip())
الدالة strip() تحذف المسافات والمحارف البيضاء من بداية النص ونهايته، ومنها \n. إذا كنت تريد حذف نهاية السطر فقط مع الحفاظ على المسافات الأخرى، فاستخدم rstrip("\n") بدلًا منها.
ماذا يحدث إذا كان الملف غير موجود؟
إذا حاولت فتح ملف غير موجود بوضع القراءة r، سيظهر خطأ لأن بايثون لا تستطيع قراءة ملف غير موجود.
with open("missing.txt", "r", encoding="utf-8") as file:
print(file.read())
سيظهر خطأ يشبه:
FileNotFoundError: [Errno 2] No such file or directory: 'missing.txt'
إذا ظهر لك هذا الخطأ، راجع حل FileNotFoundError في بايثون لفحص اسم الملف والمسار والمجلد الحالي. وللتعامل مع الخطأ برمجيًا يمكنك بعد هذا الدرس مراجعة شرح try وexcept في بايثون.
معلومة مهمة: وضعrيحتاج أن يكون الملف موجودًا، بينما وضعwوaيمكن أن ينشئا الملف إذا لم يكن موجودًا. {alertInfo}
استخدام encoding مع الملفات العربية
عند فتح ملفات نصية، من الأفضل تحديد encoding="utf-8" صراحة بدل الاعتماد على الترميز الافتراضي للنظام. هذا مهم خصوصًا مع النصوص العربية وعند نقل الكود بين أنظمة تشغيل مختلفة.
with open("arabic.txt", "w", encoding="utf-8") as file:
file.write("مرحبًا بك في بايثون العرب")
ولقراءة الملف:
with open("arabic.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
نصيحة مهمة: اجعل encoding="utf-8" عادة واضحة في أمثلة الملفات النصية، خصوصًا عندما يحتوي الملف على العربية أو سيعمل الكود على أكثر من نظام. {alertSuccess}
مثال كامل: برنامج ملاحظات بسيط
الآن لنكتب برنامجًا بسيطًا يسمح للمستخدم بكتابة ملاحظة، ثم يحفظها داخل ملف.
note = input("اكتب ملاحظتك: ")
with open("notes.txt", "a", encoding="utf-8") as file:
file.write(note + "\n")
print("تم حفظ الملاحظة بنجاح")
هذا مثال بسيط، لكنه عملي جدًا. يمكنك تطويره لاحقًا ليعرض كل الملاحظات أو يحذف ملاحظة أو يبحث داخل الملف.
مثال كامل: عرض كل الملاحظات
بعد حفظ الملاحظات داخل notes.txt، يمكننا عرضها بهذا الشكل:
with open("notes.txt", "r", encoding="utf-8") as file:
notes = file.read()
print("الملاحظات المحفوظة:")
print(notes)
بهذا تكون كتبت أول مشروع صغير يتعامل مع الملفات في بايثون.
أخطاء شائعة عند التعامل مع الملفات
1. نسيان إغلاق الملف
إذا استخدمت open() بدون with، قد تنسى كتابة close(). لذلك الأفضل استخدام with.
# الأفضل
with open("file.txt", "r", encoding="utf-8") as file:
content = file.read()
2. استخدام w بالخطأ بدل a
إذا استخدمت w مع ملف موجود، سيتم حذف محتواه القديم. إذا كنت تريد الإضافة فقط، استخدم a.
# يمسح المحتوى القديم
open("notes.txt", "w", encoding="utf-8")
# يضيف في النهاية بدون حذف القديم
open("notes.txt", "a", encoding="utf-8")
3. محاولة قراءة ملف غير موجود
وضع r يحتاج ملفًا موجودًا. إذا لم يكن الملف موجودًا سيظهر FileNotFoundError. إذا كانت المشكلة مرتبطة بالمجلد الحالي أو إنشاء المجلدات وعرض محتوياتها، فراجع أيضًا شرح مكتبة os للتعامل مع الملفات والمجلدات.
4. نسيان encoding مع اللغة العربية
عند التعامل مع العربية، استخدم:
encoding="utf-8"
خصوصًا عند القراءة والكتابة في ملفات تحتوي على نص عربي.
جدول سريع لأهم أوامر الملفات
| الأمر | وظيفته | مثال |
|---|---|---|
open() |
فتح ملف | open("file.txt", "r") |
read() |
قراءة الملف كاملًا | file.read() |
readline() |
قراءة سطر واحد | file.readline() |
readlines() |
قراءة الأسطر داخل قائمة | file.readlines() |
write() |
كتابة نص داخل الملف | file.write("Hello") |
close() |
إغلاق الملف | file.close() |
متى تستخدم read ومتى تستخدم for loop؟
استخدم read() عندما يكون الملف صغيرًا وتريد قراءة محتواه كاملًا مرة واحدة.
أما إذا كان الملف كبيرًا أو تريد معالجة كل سطر فور قراءته، فاستخدم for line in file؛ فهو يمر على الملف سطرًا سطرًا بدل تحميل المحتوى كاملًا في الذاكرة.
| الحالة | الطريقة المناسبة |
|---|---|
| ملف صغير وتريد محتواه كاملًا | read() |
| تريد أول سطر فقط | readline() |
| تريد قائمة بكل الأسطر | readlines() |
| ملف كبير أو تريد معالجة كل سطر | for line in file |
تمرين بسيط على التعامل مع الملفات
اكتب برنامجًا يطلب من المستخدم إدخال ثلاث مهام يومية، ثم يحفظها داخل ملف اسمه tasks.txt.
بعد ذلك افتح الملف واقرأ المهام واطبعها على الشاشة.
ابدأ بهذا الكود:
with open("tasks.txt", "w", encoding="utf-8") as file:
for i in range(3):
task = input("اكتب مهمة: ")
file.write(task + "\n")
with open("tasks.txt", "r", encoding="utf-8") as file:
print("المهام المحفوظة:")
print(file.read())
هذا التمرين بسيط، لكنه يجمع بين input() و for loop وكتابة الملفات وقراءتها.
ماذا تتعلم بعد التعامل مع الملفات؟
- أساسيات بايثون 29: قراءة وكتابة JSON في بايثون
- أساسيات بايثون 30: التعامل مع ملفات CSV في بايثون
- تطبيق CSV داخل مشروع بايثون منظم بعد الأساسيات
- تطبيق عملي: البحث والاستبدال داخل عدة ملفات TXT ببايثون
- توثيق بايثون الرسمي حول قراءة وكتابة الملفات
الخلاصة
في هذا الدرس تعلمت أساسيات التعامل مع الملفات في بايثون. عرفت كيف تفتح ملفًا باستخدام open()، وكيف تقرأ محتواه باستخدام read() و readline() و readlines()، وكيف تكتب داخله باستخدام write().
تعلمت أيضًا الفرق بين أوضاع الفتح المهمة:
rلقراءة ملف موجود.wللكتابة مع حذف المحتوى القديم.aللإضافة في نهاية الملف بدون حذف القديم.xلإنشاء ملف جديد فقط إذا لم يكن موجودًا.bللملفات الثنائية عند إضافته إلى Mode مثلrb.+للسماح بالقراءة والكتابة معًا مثلr+.
وتعلمت أن استخدام with هو الطريقة الأفضل، لأنها تغلق الملف تلقائيًا بعد الانتهاء. كما عرفت أهمية استخدام encoding="utf-8" عند التعامل مع نصوص عربية.
الخلاصة السريعة: استخدمwith open()لقراءة وكتابة الملفات، واختر وضع الفتح المناسب:rللقراءة،wللكتابة، وaللإضافة. {alertSuccess}
أسئلة شائعة مع إجاباتها
ما وظيفة open في بايثون؟
الدالة open() تستخدم لفتح ملف في بايثون، سواء لقراءته أو الكتابة داخله أو الإضافة عليه.
ما الفرق بين r و w و a في فتح الملفات؟
r للقراءة، و w للكتابة من البداية مع حذف المحتوى القديم، و a للإضافة في نهاية الملف بدون حذف المحتوى السابق.
لماذا نستخدم with عند فتح الملفات؟
نستخدم with لأنها تغلق الملف تلقائيًا بعد الانتهاء، وتجعل الكود أنظف وأكثر أمانًا.
هل write تضيف سطرًا جديدًا تلقائيًا؟
لا. الدالة write() لا تضيف سطرًا جديدًا تلقائيًا. إذا أردت سطرًا جديدًا، أضف \n بنفسك.
لماذا تظهر مشكلة في الحروف العربية عند قراءة الملف؟
قد يحدث ذلك بسبب الترميز. استخدم encoding="utf-8" عند فتح الملف للقراءة أو الكتابة حتى تظهر الحروف العربية بشكل صحيح.
ماذا يحدث إذا قرأت ملفًا غير موجود؟
إذا استخدمت وضع القراءة r مع ملف غير موجود، سيظهر خطأ FileNotFoundError. سنتعلم التعامل معه في درس الأخطاء القادم.




