قراءة ملف بترتيب عكسي في 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