2016-04-25 16 views
0

ディレクトリ内のユーザーが作成した最新のファイルを検索する方法はいくつかありますが、簡単な方法があるかどうかを判断する必要があります。このトピックに関するほとんどの記事は、いくつかの例では機能しているか、大きな障害があります。そのため、私は水の邪魔にならないことを願っています。ファイルを継続的に更新するファイルパスを取得する

私は、ますます潜在的なエラーが発生する可能性があるだけでなく、ファイルシステムが成長するのを見通すことができません。

私はSuperlogics Winview CP 32から連続的なストリーミングシステム用のデータを取得しています。システムを使用するたびに、私は、オペレータに、追跡する必要があるシステムの初期条件のいくつかを含むファイル名の一意の識別子を入力させる。オペレータ/ユーザの助けを借りずにそのファイル名を取得したいと思います。

結局、最終目標は、私の最初の本能だけ一致するファイルの種類を使用していたので、キーに基づいてフィルタリング、私が検索するファイルのリストを下に削り取っリストに経路内のすべてのフォルダをトリミングすることであり、最大タイムスタンプに基づいて並べ替えます。私はこれらのページから、かなり共通機能を使用:

def fileWalkIn(path='.',matches=[],filt='*.csv'): # Useful for walking through a given directory 
    """Iterates through all files under the given path using a filter.""" 
    for root, dirnames, filenames in os.walk(path): 

     for filename in fnmatch.filter(filenames, filt): 
      matches.append(os.path.join(root, filename)) 
      yield os.path.join(root, filename) 

def getRecentFile(path='.',matches=[],filt='*.dat'): 
    rr = max(fileWalkIn(path=path,matches=matches,filt=filt), key=os.path.getmtime) 
    return rr  

これははるかに私を得たが、私はする必要がないように、私は一致するファイルを探索したい場合、私は繰り返しこれを行うことはできませんを意味し、むしろかさばる遅いです一致するファイルの大量のリストを持ち歩く。

理想的には、データをオンザフライで処理し、書き込み中に実行して印刷することができます。そのため、この方法は使用できません。

これらのページから、フィルタを使用しないalex-martelliによる新しいアプローチを使用しました。これは、ディレクトリとは対照的にファイルを与えるオプションが、fileWalkInよりもずっとスリムであり、タイムスタンプを使用するとより速く動作します。

def all_subdirs_of(b='.'): # Useful for walking through a given directory 
    # Create hashable list of files or directories in the parent directory 
    results = [] 
    for d in os.listdir(b): 

     bd = os.path.join(b, d) 
     if os.path.isfile(bd):  
      results.append(bd) 
     elif os.path.isdir(bd): 
      results.append(bd) 

    # return both 
    return results 

def newest(path='.'): 

    rr = max(all_subdirs_of(b=path), key=os.path.getmtime) 
    return rr 

def getActiveFile(newFile ='.'): 

    while os.path.exists(newFile): 

     newFile = newest(newFile) 
     if os.path.isfile(newFile): 

      return newFile 
     else: 
      if newFile: 
       continue 
      else: 
       return newFile 

これは私にはるかに迅速にディレクトリ内のアクティブなファイルを取得しますが、他のファイルは私のデータ収集を開始するので、書かれていない場合に限ります。ここではあらゆる種類の問題を見ることができ、私がウサギの穴を塞いでいるかどうかを判断する助けが必要であり、ファイルサイズのテストのようなより簡単な解決法があるか、

私はさまざまな言語(java、how-to-a-running-jarファイルの取得)で他の答えを見つけましたが、Pythonで何かが必要です。私はwatchdogwin32のような機能を探求しましたが、どちらも急な学習曲線が必要です。私は非常に近いか、私のパラダイムを完全に変える必要があると感じています。

答えて

1

ジクロースは2番目のアプローチを少しスピードアップする可能性があります。 listdirのラッパーで、ディレクトリのタイムスタンプをチェックし、変更があった場合にのみディレクトリの内容を再読み込みします。

それを超えると、システムイベントをファイルに書き込むことが本当に必要です。クイックグーグルは2つのpipパッケージを公開し、Linuxのみのためのpyinotifyとウォッチドッグ。

これが役に立ちます。

関連する問題