2016-08-04 11 views
1

os.walkが特定のファイルを歩いた後に停止する方法を見つけようとしています。os.walk開始点と終了点を設定する - python

私はログファイルのディレクトリを日付順に整理しています。私はgrep検索を置き換えようとしているので、ユーザが指定した日付範囲に格納されたIPアドレスを見つけることができます。

プログラムは、次の引数がかかります。サブネットで

-i IPv4またはIPv6アドレスを

-sは日すなわち2013年12月20日には、ファイル構造

-e終了日と一致して起動

topdownオプションがエンドポイントを宣言できるようにする論理であると仮定していますが、これを実行する最も良い方法は何ですか?私はループ中に考えている。

私の質問で何か問題がある場合は、事前にお詫びします。ちょうど血糖値をチェックした、それは低い56、gdタイプ1です。


追加情報

ファイル構造は、このような

--01

--02

として流れ/ index_borderに位置することになります - - 01

----...

---- 29

___________Hopeこれは明確である、年間のフォルダには、時間単位のファイルを含む、一日のフォルダを含む、月のフォルダが含まれています。日付は私がされている下向き.___________________

終了日は、包括的である必要があります、(私は一日だけ上に移動するコードを追加することができますので、私はそれにあまりを集中していない)


を高めます日付範囲関数を作成しようとすると、私は日時書類でこれを見ていないのに驚きました。


import os, gzip, netaddr, datetime, argparse 
startDir = '.' 
def sdate_format(s): 
    try: 
     return (datetime.datetime.strptime(s, '%Y/%m/%d').date()) 
    except ValueError: 
     msg = "Bad start date. Please use yyyy/mm/dd format." 
     raise argparse.ArgumentTypeError(msg) 
def edate_format(e): 
    try: 
     return (datetime.datetime.strptime(e, '%Y/%m/%d').date()) 
    except ValueError: 
     msg = "Bad end date. Please use yyyy/mm/dd format." 
     raise argparse.ArgumentTypeError(msg) 

parser = argparse.ArgumentParser(description='Locate IP address in log files for a particular date or date range') 
parser.add_argument('-s', '--start_date', action='store', type=sdate_format, dest='start_date', help='The first date in range of interest.') 
parser.add_argument('-e', '--end_date', action='store', type=edate_format, dest='end_date', help='The last date in range of interest.') 
parser.add_argument('-i', action='store', dest='net', help='IP address or address range, IPv4 or IPv6 with optional subnet accepted.', required=True) 

results = parser.parse_args() 
start = results.start_date 
end = results.end_date 
target_ip = results.net 
startDir = '/flows/index_border/{0}/{1:02d}/{2:02d}'.format(start.year, start.month, start.day) 

print('searching...') 
for root, dirs, files in os.walk(startDir): 
    for contents in files: 
     if contents.endswith('.gz'): 
      f = gzip.open(os.path.join(root, contents), 'r') 
     else: 
      f = open(os.path.join(root, contents), 'r') 
      text = f.readlines() 
      f.close() 
      for line in text: 
       for address_item in netaddr.IPNetwork(target_IP): 
        if str(address_item) in line: 
         print line, 
+0

停止基準がどのようなものであるべきかはわかりません。それが最初に一致するアイテムですか? ( 'walk()'がディレクトリを予測可能な順序で歩いているかどうかチェックして、結果の一貫性を保証する)。より一般的には、単純なディレクトリ/ファイル構造の例と、この例の結果として得たいものですが、まだ動作していないものは歓迎します。 – zezollo

答えて

0

あなたは動作しますか動作しないかを説明する必要があります。あなたのコードの​​はうまく見えますが、私は何のテストもしていません。 typeの使用ははっきりと正しいです。 :)(ポスターは、多くの場合、そのパラメータを誤用。)

しかしstopping用として、私はあなたが行うことができます推測している:

endDir = '/flows/index_border/{0}/{1:02d}/{2:02d}'.format(end.year, end.month, end.day) 

for root, dirs, files in os.walk(startDir): 
    for contents in files: 
     .... 
    if endDir in <something based on dirs and files>: 
     break 

私はより具体的には十分なあなたのファイル構造を知りません。私がos.walkと働いて以来、いつかもありました。いずれにしても、私は条件付きbreakが歩行を早期に止める方法だと思います。

0
#!/usr/bin/env python 
import os, gzip, netaddr, datetime, argparse, sys 
searchDir = '.' 
searchItems = [] 
def sdate_format(s): 
    try: 
     return (datetime.datetime.strptime(s, '%Y/%m/%d').date()) 
    except ValueError: 
     msg = "Bad start date. Please use yyyy/mm/dd format." 
     raise argparse.ArgumentTypeError(msg) 
def edate_format(e): 
    try: 
     return (datetime.datetime.strptime(e, '%Y/%m/%d').date()) 
    except ValueError: 
     msg = "Bad end date. Please use yyyy/mm/dd format." 
     raise argparse.ArgumentTypeError(msg) 


parser = argparse.ArgumentParser(description='Locate IP address in log files for a particular date or date range') 
parser.add_argument('-s', '--start_date', action='store', type=sdate_format, dest='start_date', 
         help='The first date in range of interest.', required=True) 
parser.add_argument('-e', '--end_date', action='store', type=edate_format, dest='end_date', 
         help='The last date in range of interest.', required=True) 
parser.add_argument('-i', action='store', dest='net', 
         help='IP address or address range, IPv4 or IPv6 with optional subnet accepted.', required=True) 

results = parser.parse_args() 
start = results.start_date 
end = results.end_date + datetime.timedelta(days=1) 
target_IP = results.net 
dateRange = end - start 
for addressOfInterest in(netaddr.IPNetwork(target_IP)): 
    searchItems.append(str(addressOfInterest)) 
print('searching...') 

for eachDay in range(dateRange.days): 
    period = start+datetime.timedelta(days=eachDay) 
    searchDir = '/flows/index_border/{0}/{1:02d}/{2:02d}'.format(period.year, period.month, period.day) 

for contents in os.listdir(searchDir): 
    if contents.endswith('.gz'): 
     f = gzip.open(os.path.join(searchDir, contents), 'rb') 
     text = f.readlines() 
     f.close() 

    else: 
     f = open(os.path.join(searchDir, contents), 'r') 
     text = f.readlines() 
     f.close() 
#for line in text: 
# break 

for addressOfInterest in searchItems: 
    for line in text: 
     if addressOfInterest in line: 
     # if str(address_item) in line: 
      print contents 
      print line, 

私は重複を印刷していると思っていたので、私は頭を叩きました。テストするファイルに重複があることが判明しました。ファイルシステムの予測可能性のためにos.walkを削除しましたが、@ hpauljは正しい解決策を提供しました。とても有難い!

関連する問題