"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني قراءة ملف كبير بكفاءة بترتيب عكسي باستخدام Python؟

كيف يمكنني قراءة ملف كبير بكفاءة بترتيب عكسي باستخدام Python؟

نشر في 2025-04-15
تصفح:932

How Can I Efficiently Read a Large File in Reverse Order Using Python?

قراءة ملف بترتيب عكسي في Python فيما يلي حل فعال لمعالجة هذه المهمة:

مولد قارئ السطر العكسي

يحدد الكود التالي وظيفة المولد ، REVELS_READLINE ، التي تعطي خطوط الملف بترتيب عكسي. يستخدم نهجًا قائمًا على المخزن المؤقت لتحسين الأداء والتعامل مع الملفات الكبيرة بفعالية:

استيراد نظام التشغيل def revers_readline (اسم الملف ، buf_size = 8192): "" "مولد يرجع خطوط ملف بترتيب عكسي" "" " مع Open (اسم الملف ، "RB") كـ FH: الجزء = لا شيء إزاحة = 0 FH.Seek (0 ، OS.Seek_end) file_size = المتبقية _size = fh.tell () بينما تبقى _size> 0: الإزاحة = min (file_size ، إزاحة buf_size) fh.seek (file_size - إزاحة) Buffer = fh.read (دقيقة (المتبقية _size ، buf_size)) # قم بإزالة الملف الأخير "\ n" إذا كان موجودًا ، فقط للمخزن المؤقت الأول إذا تبقى _size == file_size و buffer [-1] == ord ('\ n'): المخزن المؤقت = المخزن المؤقت [:-1] المتبقية _size -= buf_size خطوط = buffer.split ('\ n'.encode ()) # إلحاق الجزء الأخير من الجزء الأخير من هذا الجزء الأخير إذا لم يكن الجزء لا شيء: الخطوط [-1] = قطاع الجزء = الخطوط [0] الخطوط = الخطوط [1:] # خطوط العائد في هذا الجزء باستثناء الجزء لخط في عكس (الخطوط): # فقط فك التشفير على خط محلل ، لتجنب خطأ UTF-8 Decode خط العائد. decode () # لا تسفر عن شيء إذا كان الملف فارغًا إذا لم يكن الجزء لا شيء: العائد على جزء. decode ()

import os

def reverse_readline(filename, buf_size=8192):
    """A generator that returns the lines of a file in reverse order"""
    with open(filename, 'rb') as fh:
        segment = None
        offset = 0
        fh.seek(0, os.SEEK_END)
        file_size = remaining_size = fh.tell()
        while remaining_size > 0:
            offset = min(file_size, offset   buf_size)
            fh.seek(file_size - offset)
            buffer = fh.read(min(remaining_size, buf_size))
            # remove file's last "\n" if it exists, only for the first buffer
            if remaining_size == file_size and buffer[-1] == ord('\n'):
                buffer = buffer[:-1]
            remaining_size -= buf_size
            lines = buffer.split('\n'.encode())
            # append last chunk's segment to this chunk's last line
            if segment is not None:
                lines[-1]  = segment
            segment = lines[0]
            lines = lines[1:]
            # yield lines in this chunk except the segment
            for line in reversed(lines):
                # only decode on a parsed line, to avoid utf-8 decode error
                yield line.decode()
        # Don't yield None if the file was empty
        if segment is not None:
            yield segment.decode()

سيطبع هذا خطوط الملف بترتيب عكسي.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3