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