「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Pythonを使用して、大きなファイルを逆の順序で効率的に読み取るにはどうすればよいですか?

Pythonを使用して、大きなファイルを逆の順序で効率的に読み取るにはどうすればよいですか?

2025-03-22に投稿されました
ブラウズ:800

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

Python

でファイルを逆順序で読み取る必要があり、最後の行から最初の行までの内容を読み取る必要がある場合、Pythonの組み込み機能は適切ではないかもしれません。このタスクに取り組むための効率的なソリューションは次のとおりです。バッファベースのアプローチを使用してパフォーマンスを最適化し、大きなファイルを効果的に処理します:

インポートOS def reverse_readline(filename、buf_size = 8192): "" "ファイルの行を逆の順序で返すジェネレーター" " fhとしてのopen(filename、 'rb'): セグメント=なし オフセット= 0 fh.seek(0、os.seek_end) file_size = resight_size = fh.tell() while_size> 0: offset = min(file_size、offset buf_size) fh.seek(file_size-オフセット) buffer = fh.read(min(resight_size、buf_size))) #最初のバッファーの場合にのみ、ファイルの最後の「\ n」を削除します rester_size == file_sizeとbuffer [-1] == ord( '\ n')の場合: バッファー=バッファー[:-1] rester_size - = buf_size lines = buffer.split( '\ n'.encode()) #このチャンクの最後の行に最後のチャンクのセグメントを追加する セグメントがいない場合: 行[-1] =セグメント セグメント=行[0] lines = lines [1:] #セグメントを除くこのチャンクの回線 逆転の行(行): #UTF-8デコードエラーを回避するために、解析された線でのみデコード 派生line.decode() #ファイルが空であれば、何も生じないでください セグメントがいない場合: 獲得segment.decode()

uesage:

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

を使用することができます。 print(line) これにより、ファイルの行が逆の順序で印刷されます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3