كيفية فتح ملف في Python وقراءة ملف نصي سطرًا بسطر
مقدمة إلى قراءة الملفات النصية في Python
تُعد قراءة الملفات النصية من المهارات الأساسية التي يحتاجها أي مطور يعمل بلغة Python، سواء كان الهدف معالجة البيانات، أو قراءة ملفات الإعدادات، أو التعامل مع السجلات النصية. توفر اللغة عدة أساليب مدمجة تجعل هذه المهمة مرنة وسهلة، بدءًا من الدالة open() ووصولًا إلى استخدام with لقراءة الملفات بطريقة آمنة ومنظمة.
في هذا الدليل، سنتعرف على أهم الطرق المستخدمة لفتح ملف نصي وقراءته سطرًا بسطر، مع شرح عملي للدوال read() وreadline() وreadlines() وclose() وreadable()، بالإضافة إلى أفضل الممارسات عند التعامل مع الملفات.

ما هي الدالة open() في Python؟
قبل أن تتمكن من قراءة أي ملف نصي في Python، يجب أولًا فتحه باستخدام الدالة open(). هذه الدالة تُنشئ كائن ملف يمكنك من خلاله تنفيذ عمليات القراءة أو الكتابة بحسب الوضع المحدد.
الصيغة الأساسية للدالة هي:
open("name of file you want opened", "optional mode")
تحديد اسم الملف والمسار الصحيح
إذا كان الملف النصي موجودًا في المجلد نفسه الذي يحتوي على ملف Python الحالي، فيكفي كتابة اسم الملف فقط:
open("demo.txt")
في هذه الحالة، سيبحث Python عن الملف داخل الدليل الحالي مباشرة.

أما إذا كان الملف النصي داخل مجلد مختلف، فلا بد من تمرير المسار الصحيح للملف:

على سبيل المثال، إذا كان الملف random-text.txt موجودًا داخل مجلد اسمه text-files، فيمكن فتحه بالشكل التالي:
open("text-files/random-text.txt")
إذا كان المسار غير صحيح، فستظهر رسالة خطأ لأن Python لن يتمكن من العثور على الملف:
open("random-text.txt")

لذلك، من المهم دائمًا التأكد من المجلد الحالي ومسار الملف قبل محاولة قراءته.
أوضاع القراءة في open()
تدعم الدالة open() عدة أوضاع للتعامل مع الملفات. الوضع الافتراضي هو وضع القراءة ويرمز له بالحرف r.
open("demo.txt", mode="r")
ويمكن كتابة الوضع بشكل مختصر دون استخدام اسم الوسيط:
open("demo.txt", "r")
هناك أوضاع أخرى مثل:
wللكتابة.aللإضافة في نهاية الملف.
لكن بما أن هذا المقال يركز على قراءة الملفات، فسنكتفي بأهم ما يخص وضع القراءة.
معاملات إضافية في open()
إلى جانب اسم الملف والوضع، تقبل الدالة open() معاملات اختيارية أخرى تساعد على التحكم في طريقة فتح الملف، مثل:
bufferingencodingerrorsnewlineclosefdopener
وتُستخدم هذه المعاملات عادة في السيناريوهات المتقدمة، خصوصًا عند التعامل مع ترميزات مختلفة أو ملفات كبيرة.
ما وظيفة readable() في Python؟
إذا أردت التأكد من أن الملف المفتوح يدعم القراءة، يمكنك استخدام الدالة readable(). تعيد هذه الدالة إحدى القيمتين True أو False.
هذا المثال سيعيد True لأن الملف مفتوح في وضع القراءة:
file = open("demo.txt")
print(file.readable())

أما إذا تم فتح الملف في وضع الكتابة w، فستكون النتيجة False:
file = open("demo.txt", "w")
print(file.readable())

استخدام read() لقراءة محتوى الملف بالكامل
تُستخدم الدالة read() لقراءة كامل محتوى الملف كنص واحد من النوع string. هذا الأسلوب مناسب عندما يكون الملف صغيرًا أو متوسط الحجم.
file = open("demo.txt")
print(file.read())

قراءة عدد محدد من الأحرف باستخدام read(size)
يمكنك تمرير قيمة عددية إلى read() لقراءة جزء فقط من الملف بدلًا من محتواه الكامل. تمثل هذه القيمة عدد الأحرف المراد قراءتها.
file = open("demo.txt")
print(file.read(4))

إذا لم تُمرر قيمة، أو مررت عددًا سالبًا، فسيتم قراءة الملف كاملًا.
أهمية close() بعد الانتهاء من الملف
بعد الانتهاء من التعامل مع الملف، يُفضل إغلاقه باستخدام close(). إهمال هذه الخطوة قد يؤدي إلى مشاكل في إدارة الموارد، خاصة في البرامج الأكبر أو عند التعامل مع عدد كبير من الملفات.
file = open("demo.txt")
print(file.read())
file.close()
رغم أن Python قد تغلق الملف تلقائيًا في بعض الحالات، فإن الاعتماد على ذلك ليس ممارسة موصى بها.
لماذا يُفضل استخدام with عند قراءة الملفات؟
أفضل طريقة عملية وآمنة للتعامل مع الملفات في Python هي استخدام الكلمة المفتاحية with. عند استخدامها، يُغلق الملف تلقائيًا بمجرد انتهاء الكتلة البرمجية، حتى لو حدث خطأ أثناء التنفيذ.
with open("demo.txt") as file:
print(file.read())
هذه الطريقة تُعد من أفضل الممارسات لأنها تجعل الكود أوضح وأكثر موثوقية.
استخدام readline() لقراءة الملف سطرًا واحدًا
إذا كنت لا تريد قراءة الملف بالكامل دفعة واحدة، بل تحتاج إلى سطر واحد فقط في كل مرة، فاستخدم readline(). تعيد هذه الدالة أول سطر متاح من الملف.
لنفترض أن الملف يحتوي على السطرين التاليين:
This is the first line
This is the second line
عند تنفيذ المثال التالي، سيتم طباعة السطر الأول فقط:
with open("demo.txt") as file:
print(file.readline())

استخدام size مع readline()
مثل read()، يمكن أيضًا تمرير قيمة إلى readline() لتحديد عدد الأحرف المقروءة من السطر:
with open("demo.txt") as file:
print(file.readline(7))

استخدام readlines() لإرجاع جميع الأسطر في قائمة
تُستخدم الدالة readlines() عندما تحتاج إلى قراءة كل أسطر الملف دفعة واحدة وإرجاعها في صورة قائمة list. يكون كل عنصر في القائمة سطرًا مستقلًا من الملف.
with open("demo.txt") as file:
print(file.readlines())

هذه الطريقة مفيدة عندما تحتاج إلى معالجة جميع الأسطر لاحقًا كعناصر داخل قائمة، لكنها قد لا تكون الخيار الأمثل مع الملفات الكبيرة جدًا.
قراءة الملف سطرًا بسطر باستخدام for loop
من أكثر الطرق كفاءة ووضوحًا لقراءة ملف نصي في Python استخدام for loop مباشرة على كائن الملف. هذا الأسلوب مناسب جدًا عند التعامل مع ملفات كبيرة، لأنه يقرأ البيانات تدريجيًا بدل تحميلها كاملة في الذاكرة.
with open("demo.txt") as file:
for item in file:
print(item)

إذا كان هدفك هو قراءة ملف نصي سطرًا بسطر بكفاءة، فغالبًا ستكون هذه هي الطريقة الأنسب.
مقارنة سريعة بين طرق قراءة الملفات في Python
| الطريقة | الوظيفة | متى تُستخدم؟ |
|---|---|---|
read() |
قراءة كامل الملف كنص واحد | عندما يكون حجم الملف صغيرًا |
readline() |
قراءة سطر واحد فقط | عند الحاجة لالتقاط سطر محدد |
readlines() |
قراءة جميع الأسطر داخل قائمة | عند معالجة الأسطر كعناصر قائمة |
for loop |
قراءة الملف سطرًا بسطر | للكفاءة والوضوح مع الملفات الكبيرة |
أفضل الممارسات عند قراءة الملفات النصية
- استخدم
withبدلًا من الاعتماد علىclose()يدويًا. - تأكد من صحة اسم الملف والمسار قبل التشغيل.
- اختر طريقة القراءة المناسبة حسب حجم الملف.
- استخدم
readline()أوfor loopإذا كنت تحتاج إلى القراءة التدريجية. - كن حذرًا عند استخدام
read()مع الملفات الكبيرة حتى لا تستهلك الذاكرة بشكل غير ضروري.
الخلاصة التقنية
توفر Python واجهة بسيطة وقوية للتعامل مع الملفات النصية، لكن اختيار الطريقة المناسبة يعتمد على حجم الملف وطبيعة المعالجة المطلوبة. من الناحية العملية، يظل استخدام with open(...) مع for loop هو الخيار الأفضل في معظم الحالات، لأنه يجمع بين الأمان، والوضوح، والكفاءة في استهلاك الذاكرة. أما إذا كان الملف صغيرًا وتحتاج إلى محتواه كاملًا دفعة واحدة، فستكون read() كافية ومباشرة.