2015-06-16 10 views
3

Я ищу возможность поиска определенных подкаталогов в python.Рекурсивно разворачивать и искать шаблон для определенных подкаталогов

Например структура каталогов, как это:

some_files/ 
    common/ 
    2009/ 
    2010/ 
    2011/ 
    ... 

Я только хочу, чтобы искать в подкаталогах, которые начинаются с 2, так что это должно быть что-то вроде «some_files/2 *». Я думаю, что это должно быть возможно, используя glob.glob и os.walk(), но я не могу заставить его работать.

Сейчас я использую:

files = [os.path.join(dirpath, f) 
       for dirpath, dirnames, files in os.walk(d) 
       for f in files if f.endswith(ext)] 

, но это не соответствует конкретным потребностям.

Может кто-то помочь мне, будет очень признателен!

+0

Что с чем-то вроде 'и зева .path.join ('some_files', '2') в dirpath'? – TigerhawkT3

+1

Инструмент, который я разрабатываю, ищет определенные файлы в указанных вами местах. Эти места указаны в файле конфигурации. Поэтому они могут сказать, что вы можете посмотреть в этой папке (some_files /), затем он также ищет все подкаталоги. Я хочу предоставить пользователю возможность поиска только в определенных подкаталогах с инструкцией типа somefiles/2 *. Если я правильно понимаю, этот вариант не поддержит. Пожалуйста, поправьте меня, если я ошибаюсь :) – Juvawa

+0

Почему бы не работать? Он просто проверяет, найдена ли указанная строка в строке пути. – TigerhawkT3

ответ

2

Вы можете использовать Glob с dirpath, чтобы найти соответствующие каталоги:

from glob import iglob 
import os 

files = [] 
ext = "py" 
for dirpath, dirnames, file in os.walk(path): 
    match = next(iglob(os.path.join(dirpath, "2*")),"") 
    if match: 
     files.extend(iglob(os.path.join(match,"*.{}".format(ext)))) 
print(files) 

Или, если вы действительно хотите список Комп:

files = [f for dirpath, dirnames, file in os.walk(path) for f in 
     iglob(os.path.join(next(iglob(os.path.join(dirpath, "2*")), 
           '\\\\'), "*.{}".format(ext)))] 
print(files) 
+0

Спасибо большое! Это сработало! – Juvawa

3

Я хотел бы сделать это, как это, используя pathlib (, который является теперь частью Python3 станд Lib):

from pathlib import Path 

for subpath in Path().glob("2*): 
    for file in subpath.glob("*.ext"): 
     # ... 

Update:pathlib также доступна для Python 2.x (это было с обратной связью и опубликованы до Python Package Index). Просто:

$ pip install pathlib 
+1

* pathlib * также доступен для версии 2.7+, просто необходимо установить вручную – smci

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

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