首頁 >後端開發 >Python教學 >如何使用Python高效逆序讀取大檔案?

如何使用Python高效逆序讀取大檔案?

Susan Sarandon
Susan Sarandon原創
2024-11-25 09:59:11613瀏覽

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

在Python 中以相反順序讀取檔案

如果您正在處理一個大檔案並且需要從最後一個讀取其內容首先,Python 的內建函數可能不適合。這是解決此任務的有效解決方案:

反向行讀取器產生器

以下程式碼定義了一個產生器函數,reverse_readline,它反向生成文件的行命令。它使用基於緩衝區的方法來優化效能並有效處理大型檔案:

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()

用法:

要使用此產生器,您只需迭代它即可在for 循環中:

for line in reverse_readline('myfile.txt'):
    print(line)

這將以相反的順序列印檔案的行。

以上是如何使用Python高效逆序讀取大檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn