home changes contents help options

167:ファイルの先頭のn行を削除する

163:ファイルに一行挿入する とほぼ同じ方法になります。先頭 n 行を省いた一時ファイルを作成し 元ファイルにリネームします。

import tempfile
import os
import stat

def _rename(f1, f2):
    u"""
    f1 を f2 にリネームする。
    Windows 上ではリネーム先にファイルが存在すると
    os.rename が WindowsError 例外となる。
    これを防ぐためリネーム先ファイルを削除する。
    """
    if os.name == 'nt':
        os.remove(f2)
        os.rename(f1, f2)
    else:
        os.rename(f1, f2)


def remove_head(file_name, lines):
    u"""
    ファイルの先頭 lines 行を削除する
    """
    st = os.stat(file_name)
    mode = stat.S_IMODE(st.st_mode)

    temp = tempfile.mkstemp(text=True, dir=os.path.dirname(file_name))
    temp_file = os.fdopen(temp[0], 'wb')
    temp_name = temp[1]

    try:
        file_ = open(file_name, 'rb')
        try:
            for n in range(lines):
                file_.readline()
            for line in file_:
                temp_file.write(line)
        finally:
            file_.close()
        temp_file.close()
        _rename(temp_name, file_name)
    except:
        # 処理に失敗したら一時ファイルを削除する
        temp_file.close()
        os.remove(temp_name)
        raise

    os.chmod(file_name, mode)