English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الملف هو موقع مسمى على القرص المضغوط يستخدم لتخزين المعلومات ذات الصلة. يتم استخدامه لتخزين البيانات بشكل دائم في الذاكرة غير المتغيرة (مثل القرص الصلب).
بسبب قابلية ذاكرة الوصول العشوائي (RAM) للتغيير، يفقد بياناتها عند إغلاق الحاسوب، لذا نستخدم الملفات لاستخدام البيانات في المستقبل.
عندما نريد قراءة أو كتابة ملف، يجب علينا أولاً فتحه. بعد الانتهاء، يجب إغلاقه لتحرير الموارد المربوطة بالملف.
لذلك، في بايثون، يتم تنفيذ عمليات الملف وفقًا للترتيب التالي.
فتح الملف
القراءة أو الكتابة (تنفيذ العمل)
إغلاق الملف
يحتوي بايثون على دالة مدمجة open() لفتح الملف. تعود هذه الدالة إلى ملف Object، يُسمى أيضًا مفتاح، لأنه يستخدم لقراءة أو تعديل الملف.
>>> f = open("test.txt") # فتح ملف في الدليل الحالي >>> f = open("C:/Python33/README.txt") # تحديد المسار الكامل
يمكننا تحديد نمط الملف عند فتحه. في النمط، نحدد إذا كنا نريد القراءة 'r' أو الكتابة 'w' أو الإضافة 'a' إلى الملف. كما نحدد إذا كنا نريد فتح الملف في نمط نصي أو ثنائي.
الإعداد الافتراضي هو القراءة في النمط النصي. في هذا النمط، عندما نقرأ من الملف، نحصل على سلسلة.
من جهة أخرى، يعود النمط الثنائي إلى البايتات، وهو النمط المستخدم لمعالجة الملفات غير النصية (مثل الصور أو ملفات exe).
النمط | الوصف |
---|---|
'r' | فتح الملف للقراءة (افتراضي) |
'w' | فتح الملف للكتابة. إذا لم يكن موجودًا، يتم إنشاء ملف جديد، أو إذا كان موجودًا يتم قطعه. |
'x' | فتح الملف للإنشاء الحصري. إذا كان الملف موجودًا، يفشل العمل. |
'a' | فتح الملف للإضافة في نهاية الملف دون قطع. إذا لم يكن موجودًا، يتم إنشاء ملف جديد. |
't' | فتح الملف في نمط نصي (افتراضي) |
'b' | فتح الملف في نمط ثنائي. |
'+' | فتح الملف للتحديث (القراءة والكتابة) |
f = open("test.txt") # يساوي 'r' أو 'rt' f = open("test.txt",'w') # كتابة نصي f = open("img.bmp",'r+b') # قراءة و كتابة في النمط الثنائي
مختلف عن اللغات الأخرى، لا يشير الحرف 'a' إلى الرقم 97 قبل الترميز باستخدام ASCII (أو الترميز المماثل).
بالإضافة إلى ذلك، يعتمد الترميز الافتراضي على المنصة. في Windows، 'cp1252' ولكن 'utf-8' في Linux.
لذلك، لا يمكننا الاعتماد على الترميز الافتراضي، وإلا قد يختلف سلوك شيفرة لدينا على منصات مختلفة.
لذلك، يُنصح بشدة بتسمية نوع الترميز عند التعامل مع الملفات بشكل نصي.
f = open("test.txt",mode='r',encoding='utf-8')
بعد إكمال عمليات الملف، نحتاج إلى إغلاق الملف بشكل صحيح.
إغلاق الملف سيحرر الموارد المربوطة بالملف ويتم تنفيذ ذلك باستخدام طريقة close().
لدي بايثون مسؤول عن التجميع، ولكن لا يمكننا الاعتماد على ذلك لإغلاق الملف.
f = open("test.txt",encoding='utf-8') # تنفيذ عمليات ملف f.close()
هذه الطريقة ليست آمنة تمامًا. إذا حدث استثناء أثناء تنفيذ بعض العمليات على الملف، فإن الكود سيخرج دون إغلاق الملف.
من الطرق الأكثر أمانًا هو استخدامtry ... finallyكتلة.
try: f = open("test.txt",encoding='utf-8') # تنفيذ عمليات ملف finally: f.close()
بهذا، يمكننا التأكد من إغلاق الملف بشكل صحيح حتى إذا تم إطلاق الاستثناء، مما يؤدي إلى توقف تدفق البرنامج.
من الأفضل استخدام جملة with. يمكنها ضمان إغلاق الملف عند مغادرة الكتلة الداخلية.
لا نحتاج إلى استدعاء طريقة close() بشكل مباشر. يتم تنفيذها تلقائيًا.
with open("test.txt",encoding='utf-8') as f: # تنفيذ عمليات ملف
لإكمال الكتابة في الملف باستخدام بايثون، يمكننا الكتابة في نموذج 'w'، الإضافة في نموذج 'a' أو إنشاء ملف جديد وحيد في نموذج 'x'.
نحن بحاجة إلى استخدام نموذج 'w' بحذر، لأنه سيقوم بملء الملف (إذا كان موجودًا). سيتم حذف جميع البيانات السابقة.
كتابة سلسلة النصوص أو سلسلة البايتات (للملفات الثنائية) يتم تنفيذها باستخدام الطريقة write(). تعود هذه الطريقة بحجم النصوص التي تم كتابتها في الملف.
with open("test.txt",'w',encoding='utf-8') as f: f.write("my first file\n") f.write("This file\n\n") f.write("contains three lines\n")
إذا لم يكن 'test.txt' موجودًا، فإن البرنامج سيقوم بإنشاء ملف جديد يُدعى. إذا كان موجودًا بالفعل، سيقوم بملئه.
نحن بحاجة إلى تضمين علامات النهاية نفسها بأنفسنا، لتمييز الأطراف المختلفة.
للقراءة في ملف باستخدام بايثون، يجب علينا فتح الملف في الوضع القراءة.
هناك العديد من الطرق التي يمكن استخدامها لهذا الغرض. يمكننا استخدام الطريقة read(size) لقراءةالحجمالمعلومات. إذا لم يتم تحديدالحجمالمتغير، الذي سيقرأ ويعود إلى نهاية الملف.
>>> f = open("test.txt",'r',encoding = 'utf-8') >>> f.read(4) # قراءة 4 بيانات السابقة 'This' >>> f.read(4) # قراءة المقبلة 4 بيانات 'هذا' >>> f.read() # قراءة الباقي حتى نهاية الملف 'my first file\nThis file\ncontains three lines\n' >>> f.read() # قراءة مرة أخرى تعود نصًا فارغًا
يمكننا رؤية أن طريقة read() تعود الرمز الناتج عن النسخة '\n'. بعد الوصول إلى نهاية الملف، سنحصل على نص فارغ عند محاولة القراءة مرة أخرى.
يمكننا استخدام طريقة seek() لتغيير علامة النص الحالية (الموقع). كما أن طريقة tell() تعود بموقعنا الحالي (بعدد الأوكتيتات).
>>> f.tell() # الحصول على الموقع الحالي 56 >>> f.seek(0) # تحريك علامة النص إلى الموقع الأصلي 0 >>> print(f.read()) # قراءة الملف بأكمله هذا هو ملفي الأول هذا الملف يحتوي على ثلاثة أسطر
يمكننا استخدامدائرة التكرارقراءة السطر السطر الواحد. هذا يعمل بشكل فعال وسريع.
>>> for line in f: ... print(line, end = '') ... هذا هو ملفي الأول هذا الملف يحتوي على ثلاثة أسطر
أسطر الملف نفسه تحتوي على الرمز الناتج عن النسخة '\n'.
إضافةً إلى ذلك، تجنب print() إضافة سطرين إضافيين عند الطباعة.
أو يمكننا استخدام طريقة readline() لقراءة أسطر الملف المختلفة. هذه الطريقة تقرأ الملف حتى الرمز الناتج عن النسخة، بما في ذلك الرمز الناتج عن النسخة.
>>> f.readline() 'هذا هو ملفي الأول\n' >>> f.readline() 'هذا الملف\n' >>> f.readline() 'يحتوي على ثلاثة أسطر\n' >>> f.readline()
في النهاية، يعود طريقة readlines() قائمة بباقي أسطر الملف. عند الوصول إلى نهاية الملف (EOF)، ستعود جميع هذه الطرق إلى قيمة فارغة.
>>> f.readlines() ['هذا هو ملفي الأول\n', 'هذا الملف\n', 'يحتوي على ثلاثة أسطر\n']
يوجد العديد من الطرق المتاحة للعناصر الملفية. بعضها تم استخدامه في الأمثلة السابقة.
هذه قائمة كاملة للطرق في نمط النص وتحتوي على شرح مختصر.
close() | إغلاق الملف. |
detach() | العودة إلى تدفق النص الخام (raw stream) المفصول من المخزن. |
fileno() | العودة إلى الرقم الذي يمثل تدفق النظام المحدد من قبل النظام التشغيل. |
flush() | تحديث الحافز الداخلي. |
isatty() | العودة إلى ما إذا كان تدفق الملف هو تفاعلي. |
readable() | العودة إلى محتوى الملف. |
read() | العودة إلى ما إذا كان بالإمكان قراءة تدفق الملف. |
readline() | العودة إلى سطر في الملف. |
readlines() | العودة إلى قائمة الأسطر في الملف. |
seek() | تغيير موقع الملف. |
seekable() | العودة إلى ما إذا كان يمكننا تغيير موقع الملف. |
tell() | العودة إلى موقع الملف الحالي. |
truncate() | تغيير حجم الملف إلى الحجم المحدد. |
writeable() | العودة إلى ما إذا كان بالإمكان الكتابة في الملف. |
write() | كتابة النص المحدد في الملف. |
writelines() | كتابة قائمة النصوص في الملف. |