2012-04-06 3 views
2

Я пытаюсь использовать iglob вместо glob, чтобы получить список файлов .txt. Если файлов .txt не существует, glob не возвращает никаких ошибок, но iglob делает.Обработать ошибку iglob, когда путь к поиску не существует

Код:

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

если нет .txt файлов нет, я получаю это:

Traceback (самый последний вызов последнего):

Файл «T: \ прод \ offlineValidation \ Scripts \ goofin.py», строка 98, в iGlobLatest()

Файл "T: \ прод \ offlineValidation \ сценарии \ goofin.py", строка 88, в iGlobLatest печати dir_list.next()

StopIteration

Если я использую try/except, я могу избежать ошибки, но это единственный способ? Другие предложения по проверке существования файлов .txt связаны с использованием glob, но поскольку я пытаюсь использовать iglob вместо glob ....

ответ

2

С iglob() является генератором, он поднимает после того, как все соответствующие файлы исчерпаны. Если файл вообще отсутствует, он будет поднять StopIteration при первом вызове next().

Генераторы предназначены перебрать:

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

Таким образом, StopIteration исключение будет неявно цепляется за вас. Я не знаю, что вы на самом деле пытаетесь сделать, но, возможно, это то, что вы хотите: (. Python 2.6 или выше)

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

+1

Я думаю, что его также хорошо особо отметить, что iglob не вызов, вызывающий исключение, как указано в op. Он не отвечает иначе, чем вызов glob рядом с типом возврата. Его вызов возвращаемого типа (генератора), который вызывает исключение, так же, как если бы вы пытались сказать 'l = glob ('foo'); l [0] ', если glob не вернул никаких результатов. – jdi

+0

Спасибо за информацию. Я не знал, что вы также можете пройти через итератор со следующим (итератором). И это также объясняет, почему я видел исключение, когда использовал iglob() так, как я сделал против glob(). – itchmyback

+0

@itchmyback: 'next (iterator)' делает то же самое, что и 'iterator.next()'. Последняя форма не позволяет предоставить значение по умолчанию, если итератор исчерпан. –

Смежные вопросы