Итерация по каталогам приводит к ошибке, не связанной с итератором

#python #iterator #directory #subdirectory

#python #итератор #каталог #подкаталог

Вопрос:

Я попробовал точный код на этой странице для перебора подкаталогов. Однако я получаю следующую ошибку:

   File "dir_iterator.py", line 29, in <module>
    for x in it:
TypeError: iter() returned non-iterator of type 'iterdir'
 

В чем проблема и как ее можно решить?

Примечание: я использую Python версии 3.5.3 в Debian Stable Linux

Редактировать: как было предложено @DroidX86 в комментариях ниже, я публикую код дословно, скопированный по этой ссылке:

 import os

class iterdir(object):
    def __init__(self, path, deep=False):
    self._root = path
    self._files = None
    self.deep = deep
    def __iter__(self):
    return self
    def next(self):
    if self._files:
        join = os.path.join
        d = self._files.pop()
        r = join(self._root, d)
        if self.deep and os.path.isdir(r):
        self._files  = [join(d,n) for n in os.listdir(r)]
    elif self._files is None:
        self._files = os.listdir(self._root)
    if self._files:
        return self._files[-1]
    else:
        raise StopIteration


# sample:
#   a deep traversal of directories which starts with a vowel
#
it = iterdir('.')
for x in it:
    p = os.path.basename(x)
    it.deep = p[0].lower() in "aeiou"
    print x
 

Комментарии:

1. Пожалуйста, разместите свой код здесь. Даже если он скопирован дословно из другого источника — ссылки гниют.

Ответ №1:

Код написан для python2. По любой причине, если вы хотите, чтобы он запускался с python3, измените def next: на def __next__: и print x на print(x) . Эти два изменения, необходимые для преобразования кода python2 в ссылке на python3.

 import os


class iterdir(object):
    def __init__(self, path, deep=False):
        self._root = path
        self._files = None
        self.deep = deep

    def __iter__(self):
        return self

    def __next__(self):
        if self._files:
            join = os.path.join
            d = self._files.pop()
            r = join(self._root, d)
            if self.deep and os.path.isdir(r):
                self._files  = [join(d, n) for n in os.listdir(r)]
        elif self._files is None:
            self._files = os.listdir(self._root)

        if self._files:
            return self._files[-1]
        else:
            raise StopIteration


# sample:
#   a deep traversal of directories which starts with a vowel
#
it = iterdir('.')
for x in it:
    p = os.path.basename(x)
    it.deep = p[0].lower() in "aeiou"
    print(x)
 

Ответ №2:

Связанный код написан для python2.

вы работаете с использованием python3.

либо вам придется внести изменения в код, чтобы он работал на python3, либо вы можете использовать python2.