Python ファイル内の最終行に指定文字列があるかを確認し、無ければ追記する。

表題の件を成すには最終行を取得する必要があり、その方法は下記2点です。
lastrow = sum(1 for i in open([ファイル名])) # ファイル内の最終行の番号を取得
lastrow_sen = linecache.getline([ファイル名], [指定行]) # ファイル内の指定行を取得

本プログラムの動作仕様を以降に示します。
はじめに、対象ファイル内の最終行に指定文字列「END」がある場合の例を下図に示す。

f:id:HK29:20180501143422p:plain

本プログラム実行の結果を下図に示す。最終行番号「9」と最終行文字列「222Eh Eh EeENDee」をprint出力し、その下にcheck OKなどと出力している。

f:id:HK29:20180501144853p:plain

次に、対象ファイルの最終行に指定文字列「END」がない場合の例を下図に示す。

f:id:HK29:20180501150142p:plain

本プログラムの実行結果を下図に示す。最終行番号「3」と最終行文字「#####」をprint出力し、その下にcheck NGなんちゃらと出力している。

f:id:HK29:20180501150342p:plain

そして、対象ファイル内を見ると、最終行に「END」が追記されているのがわかる(下図)。

f:id:HK29:20180501151252p:plain

▼本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os, 
       linecache, shutil, csv

def txtCheck(fname, check):
    if os.path.isfile(fname):
        lastrow = sum(1 for i in open(fname)) # ファイル内の最終行の行番号を取得
        lastrow_sen = linecache.getline(fname, lastrow) # ファイル内の最終行の一行を取得
        if lastrow_sen.find( check ) == -1: # 偽の場合
            print("check NG -> copy file and edit")
            shutil.copy2(fname, fname + '.backup') # ファイルのバックアップをコピーする
            with open(fname, 'a', newline='') as f:
                writer = csv.writer(f, lineterminator='\n') # ファイル内を丸々書き出し
                f.write(check + '\n') # 最終行に書き込み
        else:
            print("check OK")
    else:
        print("file not found")


if __name__ == '__main__':
    fname = './abc.csv' # 対象ファイルパス
    check = 'END' # 指定文字列
    
    txtCheck(fname, check)
    print("finished")

以上

<広告>