2016-05-18 3 views
2

Я написал скрипт python и хотел отладить его с помощью eric ide. Когда я бегу это, ошибка выскочила говоря unhandled StopIterationos.walk ошибка необработанного stopIteration

Мой фрагмент кода:

datasetname='../subdataset' 
dirs=sorted(next(os.walk(datasetname))[1]) 

Я новичок в Python и так, я не знаю, как это исправить. Почему эта ошибка появляется и как ее исправить?

ответ

3

os.walk будет генерировать имена файлов в дереве каталогов, идя вниз. Он вернет содержимое для каждого каталога. Так как это generator, он будет вызывать исключение StopIteration, когда каталогов больше нет. Обычно, когда вы используете его в цикле for, вы не видите исключение, но здесь вы напрямую вызываете next.

Если вы передаете несуществующий каталог к ​​нему будет немедленно поднять исключение:

>>> next(os.walk('./doesnt-exist')) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

Вы можете изменить код, чтобы использовать for петлю вместо next так, что вам не придется беспокоиться о том, исключение:

import os 

for path, dirs, files in os.walk('./doesnt-exist'): 
    dirs = sorted(dirs) 
    break 

другой вариант заключается в использовании try/except поймать исключение:

import os 

try: 
    dirs = sorted(next(os.walk('./doesnt-exist'))) 
except StopIteration: 
    pass # Some error handling here 
+0

Хорошо! Но как я могу это исправить? – RaviTej310

+0

@Sibi Добавлено пару примеров для ответа – niemmi

+0

Да, эта ошибка была решена, но теперь я получаю новую ошибку в двух строках ниже в 'leng = len (dirs):' say '" name 'dirs' не определен " – RaviTej310