قراءة الملفات ببايثون

المُقدّمة

للعمل مع البيانات المخزنة ، تصبح معالجة الملفات هي المعرفة الأساسية لكل مبرمج بايثون محترف. منذ إصداره الأول ، تعد كل من قراءة البيانات وكتابتها إلى الملفات من ميزات Python المضمنة. بالمقارنة مع لغات البرمجة الأخرى مثل C أو Java ، فهي بسيطة جدًا ولا تتطلب سوى بضعة أسطر من التعليمات البرمجية. علاوة على ذلك ، لا يلزم تحميل وحدة إضافية للقيام بذلك بشكل صحيح.

سنشرح في هذه المقالة كيفية قراءة الملفات باستخدام بايثون من خلال الأمثلة. تتضمن بعض الأمثلة قراءة ملف سطرًا بسطر ، كمقطع (عدد محدد من الأسطر في كل مرة) ، وقراءة ملف دفعة واحدة. أيضًا ، سنعرض لك طريقة لقراءة سطر معين من الملف ، فقط ، دون البحث في الملف بأكمله.

أساسيات الملفات في بايثون

الطرق الشائعة للعمل مع الملفات هي open() لفتح ملف ، seek() لتعيين الوضع الحالي للملف عند الإزاحة المحددة ، و close() لإغلاق كائن الملف عند الانتهاء من استخدامه. المدمج في open() تُرجع الدالة مقبض ملف يمثل كائن ملف لاستخدامه للوصول إلى الملف للقراءة أو الكتابة أو الإلحاق.

عند فتح ملف للقراءة ، تحتاج Python إلى معرفة كيفية فتح الملف بالضبط مع النظام. يتوفر وضعان للوصول - القراءة والقراءة في الوضع الثنائي. الأعلام المعنية المستخدمة هي 'r'و 'rb'، ويجب تحديدها عند فتح ملف مع ملف open() وظيفة. يتضمن الوضع الأول تفسير الأحرف الخاصة مثل "CR" (إرجاع السطر) و "LF" (تغذية سطر) لتمثيل فواصل الأسطر ، بينما يسمح لك الوضع الثنائي بقراءة البيانات في الوضع الأولي - حيث يتم تخزين البيانات كما هي دون مزيد من التفسير.

بمجرد فتح ملف ، فإن ملف open() ستعيد الدالة كائن ملف إليك. كائنات الملفات هذه لها طرق مثل read(), readline(), write(), tell()و seek(). بينما تحتوي بعض كائنات الملفات (أو الكائنات التي تشبه الملفات) على طرق أكثر من تلك المدرجة هنا ، فهذه هي الأكثر شيوعًا. لا تحتاج كل كائنات الملف إلى تنفيذ جميع أساليب الملفات.

قراءة ملف سطرا بسطر

المثال الأول مستوحى من لغتي البرمجة - C و C ++. ربما يكون هذا هو الأسلوب الأكثر سهولة - افتح الملف باستخدام امتداد open() وظيفة، اقرأ الملف سطرًا بسطر يستخدم ال readline() الطريقة ، وإخراج السطر مباشرة بعد القراءة.

قيد الاستخدام هنا ملف while الحلقة التي تقرأ باستمرار من الملف طالما أن readline() طريقة تحافظ على إعادة البيانات. في حالة الوصول إلى نهاية الملف (EOF) while تتوقف الحلقة ويتم إغلاق كائن الملف ، مما يؤدي إلى تحرير الموارد لاستخدام البرامج الأخرى:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

كما لاحظت ، فقد فتحنا وأغلقنا الملف بشكل صريح في هذا المثال. على الرغم من أن مترجم Python يغلق الملفات المفتوحة تلقائيًا في نهاية تنفيذ برنامج Python ، إلا أنه يغلق الملف بشكل صريح عبر close() أسلوب برمجة جيد ، ولا ينبغي نسيانه.

كتحسين ، فإن بروتوكول مكرر مناسب تم تقديمه في Python 2.3. هذا يسمح لك بتبسيط readline حلقة:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

قيد الاستخدام هنا ملف for حلقة في تركيبة مع in مكرر. يتم تحديد السطر الحالي بمساعدة in مكرر القراءة من الملف ، ويتم إخراج محتواه إلى stdout. تغطي Python فتح الملف وإغلاقه نيابة عنك عندما يقع خارج النطاق. على الرغم من عدم فعاليته ، إلا أنه يسمح لك بعدم الاضطرار إلى التعامل مع مقابض الملفات بعد الآن.

لسوء الحظ ، فإن الكود أعلاه أقل وضوحًا ويعتمد على مجموعة القمامة الداخلية في Python للتعامل مع إغلاق الملف.

تم تقديمه في Python 2.5 ، و with يقوم الأمر بتغليف العملية بأكملها بشكل أكبر ، ويتعامل أيضًا مع فتح الملفات وإغلاقها مرة واحدة فقط عبر كتلة التعليمات البرمجية المحددة النطاق:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

مزيج من with البيان و open() الأمر يفتح الملف مرة واحدة فقط. إذا نجح for يتم تنفيذ الحلقة ، ويتم طباعة محتوى السطر على stdout.

علاوة على ذلك ، فإن استخدام with البيان له آثار جانبية. داخليًا ، يقوم مترجم بايثون بإنشاء ملف try-finally-حظر لتغليف القراءة من الملف. يوضح المثال التالي ما يحدث بشكل أساسي داخليًا في Python بامتداد with كتل التعليمات البرمجية:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

قراءة ملف على هيئة أجزاء من الأسطر

حتى الآن ، قمنا بمعالجة ملف سطرًا بسطر. هذا بطيء نوعًا ما بالنسبة للملفات الضخمة ويمكن تحسينه بقراءة أسطر متعددة في نفس الوقت. لتحقيق ذلك ، فإن islice() طريقة من أدوات وحدة تأتي في اللعب. أيضًا ، يعمل كمكرر ويعيد جزءًا من البيانات يتكون من n خطوط. في نهاية الملف ، قد تكون النتيجة أقصر ، وفي النهاية ، ستعيد المكالمة قائمة فارغة:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

قراءة سطر معين من ملف

باستخدام الطرق الموضحة أعلاه ، يمكننا أيضًا تنفيذ إجراءات مفيدة أخرى ، مثل قراءة سطر معين من ملف. للقيام بذلك ، نستخدم العداد ونطبع السطر المناسب عندما نصل إليه أثناء التكرار خلال الملف:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

يجب أن يكون هذا سهل الفهم ، لكنه أطول قليلاً من الأمثلة السابقة. يمكن تقصيرها باستخدام لينيكاش وحدة.

يوضح المثال التالي كيفية تبسيط التعليمات البرمجية باستخدام الامتداد getline() طريقة. إذا كان رقم السطر المطلوب يقع خارج نطاق الأسطر الصالحة في الملف ، فإن ملف getline() يعيد التابع سلسلة فارغة بدلاً من ذلك:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

قراءة الملف بأكمله مرة واحدة

أخيرًا وليس آخرًا ، سنلقي نظرة على حالة مختلفة تمامًا عن المثال السابق - قراءة ملف كامل دفعة واحدة.

ضع في اعتبارك أنه في معظم الحالات ، يجب أن يكون لديك ذاكرة كافية لقراءة الملف بأكمله ، نظرًا لأن الأحرف لا تشغل مساحة كبيرة ، ولكن عليك أن تتعب من الملفات الكبيرة. يستخدم المثال التالي مجموعة من with البيان و read() طريقة. في هذه الحالة ، سنستخدم read() لتحميل محتوى الملف كتدفق بيانات:

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

تقدم Python أيضًا readlines() الطريقة التي تشبه readline() الطريقة من المثال الأول. أضع ثقتي في read()، يتم تخزين محتوى الملف في قائمة ، حيث يكون كل سطر من المحتوى عنصرًا:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

بينما readlines() سيقرأ المحتوى من الملف حتى يصل إلى EOF ، ضع في اعتبارك أنه يمكنك أيضًا تحديد كمية المحتوى المقروءة من خلال توفير sizehint المعلمة ، وهي عدد البايتات المراد قراءتها.

وفي الختام

كالعادة ، هناك أكثر من طريقة لقراءة محتويات الملف. من حيث السرعة ، كلهم ​​أكثر أو أقل في نفس الفئة. يعتمد الحل الأفضل بالنسبة لك على حالة الاستخدام المحددة الخاصة بك. نعتقد أنه من المفيد جدًا معرفة ما هو ممكن ثم اختيار الحل الأنسب.

بينما تعمل Python على تبسيط عملية قراءة الملفات إلى حد كبير ، إلا أنها قد تصبح صعبة في بعض الأحيان ، وفي هذه الحالة أوصيك بإلقاء نظرة على وثائق بايثون الرسمية للمزيد من المعلومات.

الطابع الزمني:

اكثر من ستاكابوز