2016-04-25 12 views
0

Ich habe ein paar Ansätze gefunden, um nach der neuesten Datei zu suchen, die von einem Benutzer in einem Verzeichnis erstellt wurde, aber ich muss feststellen, ob ein einfacherer Ansatz existiert. Die meisten Beiträge zu diesem Thema arbeiten in einigen Fällen oder haben große Hürden, so hoffe ich, das Wasser zu vermeiden.Dateipfad der fortlaufend aktualisierenden Datei

Ich habe Schwierigkeiten, durch ein wachsendes Dateisystem zu schauen, sowie mehr Benutzer mit mehr möglichen Fehlern hereinzubringen.

Ich bekomme Daten von einem Superlogics Winview CP 32 für ein kontinuierlich streaming System. Bei jeder Verwendung des Systems muss der Bediener eine eindeutige Kennung für den Dateinamen eingeben, die einige der Anfangsbedingungen des zu überwachenden Systems enthält. Ich möchte diesen Dateinamen ohne Hilfe des Betreibers/Benutzers erhalten.

Schließlich ist das Endziel, eine Liste von Dateien zu zerlegen, die ich nach Schlüsseln filtern möchte, also war mein erster Instinkt, nur passende Dateitypen zu verwenden, alle Ordner in einem Pfad in eine Liste zu schneiden und Sortierung basierend auf dem maximalen Zeitstempel. Ich habe einige ziemlich allgemeine Funktionen von diesen Seiten:

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  

Das ist ich bekam viel, aber es ist ziemlich sperrig und langsam, was bedeutet, dass ich dies nicht tun kann, immer wieder, wenn ich die Dateien zu erkunden, die passen, damit ich nicht zu haben eine umfangreiche Liste der passenden Dateien mit sich herumtragen.

Im Idealfall kann ich die Daten während des Schreibens im laufenden Betrieb verarbeiten, ausführen und drucken, so dass dieser Ansatz in diesem Fall nicht verwendet werden kann.

Ich habe von diesen Seiten einen neuen Ansatz von Alex-Martelli ausgeliehen, der keinen Filter verwendet, gibt die Option, Dateien im Gegensatz zu Verzeichnissen zu geben, ist viel schlanker als FileWalkIn und arbeitet schneller, wenn der Zeitstempel verwendet wird.

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 

Dies bringt mir die aktive Datei in einem Verzeichnis viel schneller, aber nur, wenn seit dem Start meiner Datenerfassung keine anderen Dateien geschrieben haben. Ich kann hier alle Arten von Problemen sehen und brauche Hilfe, um zu bestimmen, ob ich in ein Kaninchenloch gegangen bin, und es gibt eine einfachere Lösung, wie das Testen von Dateigrößen, oder ob eine zusammenhängende Lösung mit weniger potentiellen Hindernissen existiert.

Ich fand andere Antworten für verschiedene Sprachen (Java, how-to-get-the-Pfad-eines-laufenden-Jar-Datei), aber würde etwas in Python benötigen. Ich habe Funktionen wie watchdog und win32 erforscht, aber beide erfordern steile Lernkurven, und ich fühle mich wie ich bin entweder sehr nahe, oder muss mein Paradigma vollständig ändern.

Antwort

1

Dircache könnte den zweiten Ansatz ein wenig beschleunigen. Es ist ein Wrapper um listdir, der den Zeitstempel des Verzeichnisses überprüft und den Inhalt des Verzeichnisses nur dann erneut liest, wenn sich etwas geändert hat.

Darüber hinaus brauchen Sie wirklich etwas, das Dateisystemereignisse abhört. Ein schneller Google stellte zwei Pip-Pakete auf, pyinotify nur für Linux und Watchdog.

Hoffe, das hilft.