2017-02-19 5 views
0

Also arbeite ich an einem Skript, das eine Reihe von Protokolldateien durchlaufen wird, die nach Zeichenfolgen und Servernamen suchen.glob(), um Unterverzeichnisse auszuschließen

In meinem Test verwendete ich glob(), um eine Liste von Dateien zu erstellen, durch die ich troll.

Um jedoch meine Tests zu verbessern habe ich ein Protokollverzeichnis von einem Live-System (11 GB!) Kopiert - und die Dinge sind nicht so glatt wie sie vorher waren .. es sieht aus wie glob behandelt die Unterverzeichnisse als Dateien, und als solche kämpft die readlines() um sie zu lesen.

Ich interessiere mich nicht für Dateien in den Unterverzeichnissen, ich möchte nur die Dateien im nativen Verzeichnis durchsuchen.

Ich glaube, ich os.walk() dies zu erreichen, verwenden kann, mit so etwas wie:

logs = next(os.walk('var/opt/server/log/current'))[2] 

Im Gegensatz zu:

logs = glob('/var/opt/server/log/current/*') 

Weil ich Python lerne ich sicher machen will ich lernen Dinge die richtige Art und Weise .. also bin ich richtig in dem, was ich oben sage? Oder sollte ich glob() in einer etwas anderen Weise verwenden, um dieses Ziel zu erreichen?

+0

Je mehr ich mit ihm spielen, um, zu realisieren, je mehr ich, dass 'next()' ist nicht das richtige Werkzeug für den Job hier, da es anheben wird 'StopIteration', wenn es das Ende der Liste erreicht. Ich nehme an, ich könnte 'try:' und 'except:' für 'StopIteration' verwenden, aber es scheint chaotisch zu sein. Ich habe gelesen, dass 'for *()' automatisch 'StopIteration' verwendet, also wäre vielleicht eine for-Schleife durch die Verzeichnisliste besser? – jonnybinthemix

Antwort

1

Verwenden glob und auszufiltern alle dirs:

logs = [log for log in glob('/var/opt/server/log/current/*') if not os.path.isdir(log)] 
+0

Das ist großartig, danke. Das scheint gut zu funktionieren. Obwohl das Testen ein langsamer Prozess ist, wenn es jede Zeile in 11 GB von Protokolldateien durchläuft! Haha. - Ich bin mir sicher, dass ich "log for log in" verstehe. Ich bekomme das für log in .... "wäre eine Schleife für alles in der glob-Anweisung, aber was macht das erste' log'-Bit? Speichert es jede Iteration von 'für log in glob()' als 'log'? – jonnybinthemix

+0

@jonny Diese Konstruktion wird als Listenverständnis oder kurz als Liste bezeichnet. Sie können darüber im offiziellen Tutorial lesen und es gibt weitere Informationen in den Hauptdokumenten. –