home changes contents help options

168:ファイルの末尾のn行を削除する

末尾 n 行の直前までのバイト数を数え、ファイルを切り詰めます。

import collections

def remove_tail(file_name, lines):
    u"""
    ファイルの末尾 lines 行を削除する
    """

    file_ = open(file_name, 'rb+')
    try:
        pos_queue = collections.deque([0] * lines)
        del_pos = 0
        now_pos = 0
        for line in file_:
            del_pos = pos_queue.pop()
            now_pos += len(line)
            pos_queue.appendleft(now_pos)
        file_.truncate(del_pos)
    finally:
        file_.close()