2015-10-17 4 views
7

Я пытаюсь сделать следующее, в следующем порядке:Создание os.walk работы в нестандартно

Использование os.walk() идти вниз каждый каталог.
В каждом каталоге есть subfolders, но меня интересует только первые subfolder. Таким образом, каталог выглядит так:

/home/RawData/SubFolder1/SubFolder2 

Например. Я хочу, чтобы в RawData2 были папки, которые останавливаются на уровне SubFolder1.

Дело в том, что os.walk() проходит через ВСЕ из папки RawData, и я не уверен, как остановить его.

Ниже представлено то, что у меня есть до сих пор. Я пробовал ряд других комбинаций подстановки переменных dirs для root или файлов, но это, похоже, не дает мне того, что я хочу.

import os 

for root, dirs, files in os.walk("/home/RawData"): 

    os.chdir("/home/RawData2/") 
    make_path("/home/RawData2/"+str(dirs)) 
+0

Это не ясно, что то, что вы имеете в виду, вы можете объяснить больше? – Kasramvd

+0

Ну, os.walk() проходит через все уровни RawData и связанных с ними подпапок. Меня это интересует только на одном уровне, а не на всех. Может быть, другая функция будет более подходящей? –

+0

Возможно, [glob] (https://docs.python.org/3.4/library/glob.html#module-glob) будет полезной альтернативой? – swenzel

ответ

1

Я предлагаю вам вместо этого использовать glob.

В справке Glob описывает:

glob(pathname) 
    Return a list of paths matching a pathname pattern. 

    The pattern may contain simple shell-style wildcards a la 
    fnmatch. However, unlike fnmatch, filenames starting with a 
    dot are special cases that are not matched by '*' and '?' 
    patterns. 

Итак, ваша картина каждый первый каталог уровень, который я думаю будет что-то вроде этого:

/root_path/*/sub_folder1/sub_folder2 

Итак, вы начинаете в вашем корне, получите все на этом первом уровне, а затем найдите sub_folder1/sub_folder2. I думаю это произведение.

Чтобы поставить все это вместе:

from glob import glob 

dirs = glob('/root_path/*/sub_folder1/sub_folder2') 

# Then iterate for each path 
for i in dirs: 
    print(i) 
+0

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

+0

Так что вы говорите, что хотите пройти через все подкаталоги отфильтрованного соответствия? Поэтому, если вы отфильтровывали/root_path/*/sub1/sub2. Затем вы хотите взять каждый из них и повторить каждую из них для всего остального в этих путях? – idjaw

1

Остерегайтесь: Документация для os.walk говорит:

не изменить текущую рабочую директорию между возобновленной хотьбой(). ходить() никогда не изменяет текущий каталог, и предполагает, что его абонент не либо

поэтому следует избегать os.chdir("/home/RawData2/") в цикле walk.

Вы можете легко задать walk не рекурсию с помощью topdown=True и очистки dirs:

for root, dirs, files in os.walk("/home/RawData", True): 
    for rep in dirs: 
     make_path(os.join("/home/RawData2/", rep) 
     # add processing here 
    del dirs[] # tell walk not to recurse in any sub directory 
+0

Я попробую это через мгновение. Отчитается о том, как это происходит. –

+0

Ну, это лучше, потому что теперь он производит «SubFolder1», но он все равно производит все папки на уровне SubFolder2. –

+0

@ ZR: Я должен был проверить его. Список - это изменяемый объект, но 'l = []' не изменяет исходный список, а просто указывает контрольную точку на пустой список. Это должно быть 'del l [:]'. Сообщение редактировалось –

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

  • Нет связанных вопросов^_^