2015-09-29 5 views
0

Я знаю, что я могу удалить из os.walk каталоги, используя что-то вдоль линийПеремещение определенных директорий в фильтре с os.walk

for root, dirs, files in os.walk('/path/to/dir'): 
    ignore = ['dir1', 'dir2'] 
    dirs[:] = [d for d in dirs if d not in ignore] 

Я хочу сделать противоположное этому, так только сохранить в списке. Я попробовал несколько вариантов, но безуспешно. Любые указатели будут оценены.

Я заинтересован в двух уровнях вниз, поэтому я взял комментарии и создал глобальные переменные для вспомогательных уровней и использую следующий код.

Ожидаемые Функциональность

for root, dirs, files in os.walk(global_subdir): 
keep = ['dir1', 'dir2'] 
dirs[:] = [d for d in dirs if d in keep] 
for filename in files: 
    print os.path.join(root, filename) 
+5

Я не уверен на 100%, что вы просите, но вы пытались изменить «не в» на «в»? – Kevin

+0

да есть. Я обновил свой вопрос, чтобы надеяться на объяснение abit better – iNoob

+0

Пробовал ли вы 'dirs [:] = [d for d in dirs if d in keep]'? что ты получил? –

ответ

1

Как сказано в комментариях удаленного ответа -

Как уже упоминалось, это не работает. Держатели находятся в 2-х уровнях. Im предполагаю, что это является причиной проблемы

Вопрос заключается в том, что уровень каталогов один выше ваш нужный каталог не будет пройден, так как его не в вашем keep списке, следовательно, программа не достигнет до ваших необходимых каталогов.

Лучший способ решить это - запустить os.walk в каталоге, который находится всего на один уровень выше требуемой директории.

Но если это невозможно (например, каталоги на один уровень выше требуемого, неизвестно до пересечения) или (требуемые каталоги имеют разные каталоги на один уровень выше). И то, что вы действительно хотите, - это просто избегать циклирования файлов для каталогов, которые не находятся в каталоге keep.

Решение должно проходить по всем каталогам, но через files только root находится в списке keep (или для повышения производительности). Пример:

keep = set(['required directory1','required directory2']) 
for root, dirs, files in os.walk(global_subdir): 
    if root in keep: 
     for filename in files: 
      print os.path.join(root, filename) 
+0

Ананд, можете ли вы дать мне какие-либо ресурсы, чтобы попытаться понять заявление о понимании? – iNoob

+0

Не 'any (x == d для x in keep)' так же, как 'd in keep', хотя?По какой-то причине последнее не работает для ОП. – Kevin