2016-04-05 5 views
2

私はWindows Serverからさまざまなログを読んでいますが、最新のログを取得しています。python - 最後に一致する行をファイルに出力します。

次に、そのログをスキャンして、特定の文字列が含まれている最後の行のみを印刷します。

以下は、文字列を含むすべての行を出力します -

def read_logfile(master_log): 
    for line in master_log: 
     if line.contains('[76:Health]:'): 
      print line 

私は、それが見つかっただけで、最後の試合を印刷してもらうにはどうすればよいですか?

答えて

2

ちょうどあなたがヒットを取得するたびに格納し、ループの外に印刷され、これを行うための簡単な方法:

def read_logfile(master_log): 
    lastmatch = None 
    for line in master_log: 
     if '[76:Health]:' in line: 
      lastmatch = line 
    if lastmatch is not None: 
     print lastmatch 

はあなたが適切なmaxlencollections.dequeを使用して、最後n試合に一般ことができますので、あなたは、ただappendあなたは一度あなたが限界を超えたら、一番古いものを押し出して行くようにすべて一致します。以下は、上記のコードと同じに動作しますが、複数の行を印刷する第二の引数できます配列内

from collections import deque 

def read_logfile(master_log, linecount=1): 
    lastmatches = deque(maxlen=linecount) 
    for line in master_log: 
     if '[76:Health]:' in line: 
      lastmatches.append(line) 
    for line in lastmatches: 
     print line 
+0

最初のオプションは完全に機能しますが、Pythonにはstring.contains()がありませんでしたが、実際には 'if '[76:Health]:' in line:' – whoisearth

+1

@whoisearth:Iops自分自身を捕らえたはずです。私は将来の読者のために答えを修正します。 – ShadowRanger

0

ストアそれを、次いで、アレイ内の最後の項目を印刷します。 popを使用して、行をstrとして返すことができます。

def read_logfile(master_log): 
     last_line_holder = [] 
     for line in master_log: 
      if line.contains('[76:Health]:'): 
       last_line_holder.append(line) 
     print(last_line_holder[-1]) 
1

ファイルを逆順に反復することができます。

for line in reversed(master_log.readlines()): 
    if '[76:Health]:' in line: 
     print(line) 
     break 

ファイルが小さければ、それを読み込んでも問題ありません。それが大きい場合は、別のソリューションを選択してください。

関連する問題