Рекурсивно развернуть и найти шаблон конкретных подкаталогов
Я ищу вариант для поиска конкретных подкаталогов в 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