Рекурсивно развернуть и найти шаблон конкретных подкаталогов

Я ищу вариант для поиска конкретных подкаталогов в 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)]

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

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

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)

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

from pathlib import Path

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

Обновление: pathlib также доступен для Python 2.x (он был портирован и опубликован в индексе пакетов Python). Просто:

$ pip install pathlib
Другие вопросы по тегам