Рекурсивно перебирать все подкаталоги, используя pathlib

Как я могу использовать pathlib для рекурсивной итерации по всем подкаталогам данного каталога?

p = Path('docs')
for child in p.iterdir(): child

только кажется, что перебирает непосредственных потомков данного каталога.

Я знаю, что это возможно с os.walk() или же glob, но я хочу использовать pathlib, потому что мне нравится работать с объектами пути.

6 ответов

Решение

Вы можете использовать glob метод Path объект:

p = Path('docs')
for i in p.glob('**/*'):
     print(i.name)

В качестве альтернативы используйте Path.rglob (заменяет ведущий **):

p = Path("docs")
for p in p.rglob("*"):
     print(p.name)

Чтобы найти только папки, правая строка глобуса:

'**/'

Итак, чтобы найти все пути для всех папок на вашем пути, сделайте следующее:

p = Path('docs')
for child in p.glob('**/'):
    print(child)

Если вам просто нужны имена папок без путей, распечатайте имя папки следующим образом:

p = Path('docs')
for child in p.glob('**/'):
    print(child.name)

В Python 3.12 (не выпущенном на момент написания этой статьи) вы сможете использоватьpathlib.Path.walk()

Используйте понимание списка:

(1) [f.name for f in p.glob("**/*")]  # or
(2) [f.name for f in p.rglob("*")]

Можете добавить if f.is_file() или if f.is_dir()на (1) или (2), если вы хотите настроить таргетинг только на файлы или только каталоги соответственно. Или заменить"*" с каким-то узором вроде "*.txt" если вы хотите нацелиться .txt только файлы.

См. Это краткое руководство.

pathlib имеет glob метод, в котором мы можем предоставить шаблон в качестве аргумента.

Например: Path('abc').glob('**/*.txt') - будет искать текущую папку abc и все другие подкаталоги рекурсивно, чтобы найти все txt файлы.

Другие вопросы по тегам