2016-11-07 8 views
1

私はこのログファイルサンプルを持っていますが、これは過去1ヶ月間、3ヶ月間および1年間のエントリをカウントする必要があります。ここでは、ログファイルのほんの一部の数行Pythonは過去30日間のデータを返します

10/14/2015 10:04:25 AM Following file:<open file 'dirs/tmp/bundle_21241.dat.json', mode 'r' at 0x8b73498> has invalid json which is ignored 
11/15/2015 10:42:53 PM Following file:<open file 'dirs/tmp/bundle_21241.dat.json', mode 'r' at 0xa314498> has invalid json which is ignored 
10/21/2015 10:16:42 AM Following hmac:94e301ff67773de56194165451535ba223cd27588221363290fbfcb96d9d0539 with is already in database so dropping 
11/21/2015 10:16:42 AM The data for the duplicate Hmac is : HF 13300100012015-06-15 19:11:47+0000+ 12.61 0.430 1686.00 
10/21/2015 10:16:42 AM Following hmac:c35330404902c0b1bb5c6d0718407ea12b25a464433bd1e69152ccc0e0b89c9f with is already in database so dropping 
10/17/2015 10:16:42 AM The data for the duplicate Hmac is : HF 13300100012015-06-15 19:30:21+0000+ 12.61 0.010 1686.00 
10/11/2015 10:16:42 AM Following hmac:8df71a9f6b6f0a0adb48c052767045f37ec34fce9c002a1c0c5ebc38ed500bf8 with is already in database so dropping 
10/15/2015 10:16:42 AM The data for the duplicate Hmac is : HF 13300100012015-06-15 19:45:40+0000+ 12.61 0.018 1686.00 
12/21/2015 10:16:42 AM Following hmac:fda9f5756461a8bc2922c55e75a31cf4915e6b0d016ecb786666624a0f04a02f with is already in database so dropping 
12/10/2015 10:16:42 AM The data for the duplicate Hmac is : HF 13300100012015-06-15 20:01:01+0000+ 12.60 0.048 1686.00 
07/21/2015 10:16:42 AM Following hmac:84d9cdb2145b7c3e0fa2d099070b7bd291c652f30ca25c69240e33ebbd2b8677 with is already in database so dropping 

がある。ここに私のコードは、私がプログラミング初心者ですし、うまく日付の計算を理解していない

from datetime import date 
from datetime import time 
from datetime import datetime 
from datetime import timedelta 
import os 

def fileCount(fileName): 

    with open(fileName) as FileObj: 

     Count = 0 
     today_date = date.today() 
     One_Year = str(today_date - timedelta(days=365)) 
     One_Month = str(today_date - timedelta(days=30)) 
     Three_Months = str(today_date - timedelta(days=90)) 

     while True: 

      line = FileObj.readline() 

      record_date = ('-'.join(line[:10].split('/'))).split(" ") 

      if not line: 

       break 

      if "Following hmac" in line: 

       try: 
        convert_date = datetime.strptime(record_date[0], '%m-%d-%Y') 

        #print "Difference is ", todayDate - convert_date.date() 

        #print convert_date.date() 

        date_diff = str(today_date - convert_date.date()) 

        #print dateDiff[:8] 

        if date_diff[:8] < One_Month: 

         Count += 1 

         #print "Last 30 Days Failed HMAC is ", Count 

        else: 

         continue 

       #print convert_date.date() 

       except ValueError: 

        print 'This line has a problem:', record_date 


     print "The Total Number of Failed HMAC is ", Count  

# Call The function 
def main(): 

    filePath = 'file.txt' 

    fileCount(filePath) 

if __name__ == "__main__": 

    main() 

です。現在のところ、返された回答が得られていますが、正しい値が返されていないようです。目標は、各行をループし、最後の30,60、および365日間隔の行数を計算することです。現在のコードには過去30日間のテストが含まれていますが、間違った値が返されています。

+0

あなたの変数の命名が悪いです。 'OneMonth'は' one_month'という名前でなければなりません。そうでなければクラス名のように見えます。 –

+0

ありがとうございます。私は要求どおりに必要な変更を行った。 – user1895915

+0

時間がある場合は、https://www.python.org/dev/peps/pep-0008/ –

答えて

0

アイテムを比較できるようにするには、すべてをdatetimeオブジェクトに変換する必要があります。また、さまざまな範囲をリストで定義し、それに応じてPython Counter()を使用することで、すべての範囲を扱う方が簡単です。これにより、範囲の拡張が容易になります。

のようなものを探して、あなたの出力を与えるだろう
from datetime import datetime, timedelta 
from collections import Counter 


def fileCount(fileName): 
    log_entry_counts = Counter() 
    today = datetime.today() 

    date_ranges = [ 
     ('three months', today - timedelta(days=90)), 
     ('month', today - timedelta(days=30)), 
     ('year', today - timedelta(days=365))] 

    with open(fileName) as f_input: 
     for line in f_input: 
      if "Following hmac" in line: 
       log_date = datetime.strptime(line[:10], '%m/%d/%Y') 

       for text, dr in date_ranges: 
        if log_date >= dr: 
         log_entry_counts[text] += 1 

    total = 0 

    for text, count in log_entry_counts.items(): 
     print "Failed HMAC in the last {}: {}".format(text, count) 
     total += count 

    print "Total failed HMAC:", total 

fileCount('input.txt') 

Failed HMAC in the last three months: 1 
Failed HMAC in the last month: 1 
Failed HMAC in the last year: 2 
Total failed HMAC: 4 
+0

ありがとうございます。私はこれらの概念を理解するのが非常に難しいと思っています。 – user1895915

関連する問題