2012-04-06 4 views
2

Ich versuche, Iglob anstelle von Glob zu verwenden, um eine Liste von .txt-Dateien zu erhalten. Wenn keine .txt-Dateien existieren, gibt glob keine Fehler zurück, aber Iglob tut das.Handle Iglob-Fehler, wenn Pfad zu suchen nicht existiert

Code:

def iGlobLatest(): 
    dir_list = glob.iglob('*.txt') 
    print dir_list.next() 

wenn keine TXT-Dateien vorhanden sind, bekomme ich diese:

Traceback (jüngste Aufforderung zuletzt):

Datei „T: \ prod \ offlineValidation \ scripts \ goofin.py“, Linie 98, in iGlobLatest()

Datei "T: \ prod \ offlineValidation \ scripts \ goofin.py", Zeile 88, in iGlobLatest Druck dir_list.next()

StopIteration

Wenn ich try/except verwende, kann ich den Fehler vermeiden, aber ist das der einzige Weg? Andere Vorschläge zur Überprüfung der Existenz von TXT-Dateien beinhalten die Verwendung von glob, aber da ich versuche, statt glob zu verwenden iglob ....

Antwort

2

Seit iglob() ist ein Generator, es wirft StopIteration einmal alle passenden Dateien erschöpft sind. Wenn es überhaupt keine Datei gibt, wird beim ersten Aufruf von next()StopIteration ausgelöst.

Generatoren sollen iterieren:

for file in glob.iglob('*.txt'): 
    # whatever 

diese Weise die StopIteration Ausnahme wird implizit für Sie gefangen werden. Ich weiß nicht, was Sie tatsächlich versuchen zu tun, aber vielleicht ist es das, was Sie wollen: (. Python 2.6 oder höher)

return next(dir_list, None) # return first item of dir_list, 
           # or None if no files match 

+1

Ich denke, die gut auch ausdrücklich, dass iglob zu beachten ist, nicht der Anruf, der die Ausnahme anhebt, wie vom Op. Es reagiert nicht anders als der Glob-Aufruf neben dem Rückgabetyp. Es ist der Aufruf des Rückgabetyps (des Generators), der die Ausnahme auslöst, so als ob Sie versucht hätten zu sagen: l = glob ('foo'); l [0] ', wenn glob keine Ergebnisse liefert. – jdi

+0

Danke für die Info. Ich wusste nicht, dass man auch einen Iterator mit dem nächsten durchlaufen kann (Iterator). Und das erklärt auch, warum ich die Ausnahme sah, als ich iglob() so verwendete, wie ich es im Vergleich zu glob() tat. – itchmyback

+0

@itchmyback: 'next (iterator)' macht dasselbe wie 'iterator.next()'. Die letztere Form erlaubt es jedoch nicht, einen Standardwert bereitzustellen, falls der Iterator erschöpft ist. –

Verwandte Themen