2015-01-02 2 views
0

Я определил функцию в Python 3 ...рекурсивная функция не рекурсию

>>> import os 
>>> def find(path): 
... if not os.path.isdir(path): 
...  return [] 
... out_list = [] 
... for f in os.listdir(path): 
...  if os.path.isdir(f): 
...  for g in find(f): 
...   out_list.append(g) 
...  else: 
...  out_list.append(f) 
... return out_list 
... 

Похоже, это будет сползать вниз дерево path и список всех файлов (для меня во всяком случае), но когда я выполнить его ...

>>> find('..') 
['CDB', 'dv', 'DataIntegrityUtility', 'cdb', 'libvrs'] 

Все результаты представлены в каталогах, содержащих файлы. Разве там не будет больше?

+0

Почему бы не заставить 'find' генератор и' давать' файлы, как вы их находите? Код будет проще и эффективнее по памяти. И в то время, когда у вас должен быть список, вы можете просто называть его «list()». – iCodez

ответ

1

В python существует os.walk.

os.walk ('путь') => рекурсивно путешествия каталог, это дает кортеж каталог,

поддиректории и файлы

for x,y,z in os.walk('path'): 
    # z is the directory 
    # y is subdirectories 
    # x is the files 
3

Проблема заключается в том,

for f in os.listdir(path): 

будет перебираться с именами «листа», содержащимися в пути, например, если path is '/ tmp/foo and it contains bar and baz , then f will be бар , then баз`.

Но проверить, если os.path.isdir('bar') - и это означает, что 'bar', если какой-либо из текущего каталога, не тот, под '/tmp'!

Так что вам нужно, чтобы добавить что-то вроде

f = os.path.join(path, f) 

чуть ниже for заявления для остальной части логики, чтобы правильно работать. (Если вы по какой-то причине хотите просто имена листьев в out_list, вы можете извлечь их из полных строк пути с помощью os.path.basename).

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