Python Programming

قراءة أسطر محددة من الملفات بكفاءة في بايثون

Spread the love

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

محتويات

قراءة أسطر محددة من ملفات صغيرة

بالنسبة للملفات الصغيرة التي تتسع بسهولة في الذاكرة، توفر طريقة readlines() حلاً بسيطاً. تقرأ هذه الطريقة جميع الأسطر في قائمة، مما يسمح بالوصول المباشر عبر الفهرسة.


def read_specific_lines_small_file(filepath, line_numbers):
    """تقوم بقراءة أسطر محددة من ملف صغير.

    Args:
        filepath: مسار الملف.
        line_numbers: قائمة بأرقام الأسطر (فهرس يبدأ من 0) المراد قراءتها.

    Returns:
        قائمة من السلاسل، تحتوي على الأسطر المطلوبة. تُرجع قائمة فارغة إذا لم يتم العثور على الملف.
    """
    try:
        with open(filepath, 'r') as file:
            lines = file.readlines()
            return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
    except FileNotFoundError:
        return []

filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4]  # قراءة الأسطر 1، 3، و 5 (فهرس يبدأ من 0)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
    print(line)

على الرغم من بساطتها، يصبح هذا النهج غير فعال للملفات الأكبر حجماً.

الوصول إلى الأسطر بكفاءة عدة مرات

إذا كنت تصل إلى نفس الأسطر مراراً وتكراراً، يوفر مُعامل linecache مكاسب كبيرة في الأداء من خلال تخزين الأسطر مؤقتاً، مما يقلل من مدخلات/مخرجات القرص.


import linecache

def read_specific_lines_linecache(filepath, line_numbers):
    """تقوم بقراءة أسطر محددة باستخدام linecache (فهرس يبدأ من 1).

    Args:
        filepath: مسار الملف.
        line_numbers: قائمة بأرقام الأسطر (فهرس يبدأ من 1) المراد قراءتها.

    Returns:
        قائمة من السلاسل، تحتوي على الأسطر المطلوبة. تُرجع قائمة فارغة إذا لم يتم العثور على الملف أو كانت الأسطر خارج النطاق.
    """
    lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
    return lines


filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5]  # قراءة الأسطر 1، 3، و 5 (فهرس يبدأ من 1)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
    print(line)

لاحظ أن linecache يستخدم فهرسة تبدأ من 1.

معالجة الملفات الكبيرة بكفاءة

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


def read_specific_lines_large_file(filepath, line_numbers):
    """تقوم بقراءة أسطر محددة من ملف كبير بكفاءة.

    Args:
        filepath: مسار الملف.
        line_numbers: قائمة بأرقام الأسطر (فهرس يبدأ من 0) المراد قراءتها.

    Returns:
        قائمة من السلاسل، تحتوي على الأسطر المطلوبة. تُرجع قائمة فارغة إذا لم يتم العثور على الملف.
    """
    try:
        lines_to_return = []
        with open(filepath, 'r') as file:
            for i, line in enumerate(file):
                if i in line_numbers:
                    lines_to_return.append(line.strip())
        return lines_to_return
    except FileNotFoundError:
        return []

filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000]  # قراءة الأسطر 101، 501، و 1001 (فهرس يبدأ من 0)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
    print(line)

هذه الطريقة فعالة من حيث الذاكرة للملفات الضخمة.

تقنيات متقدمة لمجموعات البيانات الضخمة

بالنسبة للملفات الكبيرة بشكل استثنائي التي تتجاوز ذاكرة الوصول العشوائي المتاحة، ضع في اعتبارك الملفات المُحسّنة بالذاكرة أو المكتبات المتخصصة مثل dask أو vaex، والتي صُممت لمعالجة مجموعات البيانات التي لا تتسع في الذاكرة.

الأسئلة الشائعة

  • س: ماذا لو كان رقم السطر خارج النطاق؟ تتعامل الطرق المُقدّمة بلطف مع أرقام الأسطر خارج النطاق من خلال حذفها ببساطة.
  • س: هل يمكنني قراءة الأسطر بناءً على شرط بدلاً من رقم السطر؟ نعم، استبدل فحص رقم السطر بتعليمات شرطية (مثل: if "keyword" in line:).

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *