#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.